如何在另一个 "insert" 查询中使用 "record" 类型变量的字段?
How can I use fields of a variable of type "record" in another "insert" query?
我有一个带有复合键的数据库,另一个 table 引用了该键。简化为网络主机及其端口之间的一个非常简单的示例(省略了 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
,但是一些 table 包含 NOT NULL
约束,这不知何故阻止我声明具有该类型的变量。
上例中最后的 INSERT
语句失败。 result.*
语法是我盲目尝试的,没有任何运气。因为它是 "RECORD" 类型,PostgreSQL 不知道结构,这可能是失败的原因。
有什么方法可以实现吗?
不要使用 record
,而是为两个值使用单独的变量:
INSERT INTO host ...
RETURNING scope, hostname INTO v_scope, v_hostname;
INSERT INTO port (scope, hostname, name)
VALUES (v_scope, v_result, 'port-1');
我有一个带有复合键的数据库,另一个 table 引用了该键。简化为网络主机及其端口之间的一个非常简单的示例(省略了 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
,但是一些 table 包含 NOT NULL
约束,这不知何故阻止我声明具有该类型的变量。
上例中最后的 INSERT
语句失败。 result.*
语法是我盲目尝试的,没有任何运气。因为它是 "RECORD" 类型,PostgreSQL 不知道结构,这可能是失败的原因。
有什么方法可以实现吗?
不要使用 record
,而是为两个值使用单独的变量:
INSERT INTO host ...
RETURNING scope, hostname INTO v_scope, v_hostname;
INSERT INTO port (scope, hostname, name)
VALUES (v_scope, v_result, 'port-1');