我有一个带有复合键的数据库,另一个表引用了该键。简化为网络主机及其端口之间的一个非常简单的示例(在该示例中省去了[[all不相关的内容”),结果变成这样:
host
---------+--------
scope | TEXT
hostname | TEXT
port
---------+--------
scope | TEXT <-- Referencing host.scope
hostname | TEXT <-- Referencing host.hostname
name | TEXT
我想避免在SQL脚本中复制scope
和hostname
的值。因此,我认为可以编写和INSERT ... RETURNING ... INTO ...
语句,然后在插入的端口中重用返回的记录。所以我提出了以下内容:
BEGIN; DO $$ DECLARE result RECORD; BEGIN CREATE TEMPORARY TABLE host ( scope TEXT, hostname TEXT ); CREATE TEMPORARY TABLE port ( scope TEXT, hostname TEXT, name TEXT ); INSERT INTO host (scope, hostname) VALUES ('scope-a', 'hostname') RETURNING (scope, hostname) INTO result; RAISE NOTICE 'result = %', result; INSERT INTO port (scope, hostname, name) VALUES (result.*, 'port-1'); END $$; ROLLBACK;
我已经考虑过使用单独的变量,这将起作用,但是当使用诸如RECORD
的复合类型时,实际的脚本将在可读性和可维护性方面受益。我也尝试过使用
ROWTYPE
,但是某些表包含NOT NULL
约束,这在某种程度上阻止了我声明该类型的变量。]>以上示例中的最终
INSERT
语句失败。result.*
语法是我盲目尝试过的,没有运气。因为它是“ RECORD”类型,所以PostgreSQL不知道结构,这可能是失败的原因。有什么方法可以做到这一点?
我有一个带有复合键的数据库,另一个表引用了该键。简化为网络主机及其端口之间非常简单的示例(在此示例中,删除了所有无关紧要的内容),...
record
,但是两个值分别使用变量: