as.*_*as. 3 sql postgresql sql-types
通常希望从 SELECT 表达式中插入(例如,使用 WHERE 子句进行限定),但这会使 postgresql 对列类型感到困惑。
例子:
CREATE TABLE example (a uuid primary key, b numeric);
INSERT INTO example
SELECT a, b
FROM (VALUES ('d853b5a8-d453-11e7-9296-cec278b6b50a', NULL)) as data(a,b);
=> ERROR: column "a" is of type uuid but expression is of type text
Run Code Online (Sandbox Code Playgroud)
这可以通过显式转换值来解决:
INSERT INTO example
SELECT a, b
FROM (VALUES ('d853b5a8-d453-11e7-9296-cec278b6b50a'::uuid, NULL::numeric)) as data(a,b);
Run Code Online (Sandbox Code Playgroud)
但这很麻烦,而且是维护负担。有什么方法可以让 postgres 理解 VALUES 表达式与表行具有相同的类型,即类似于
VALUES('d853b5a8-d453-11e7-9296-cec278b6b50a', NULL)::example%ROWTYPE
Run Code Online (Sandbox Code Playgroud)
编辑:
使用 (data::example).* 的建议很简洁,但不幸的是,当与 WHERE 子句结合使用时,它似乎完全搞砸了 postgres 查询规划器,如下所示:
INSERT INTO example
SELECT (data::example).*
FROM (VALUES ('d853b5a8-d453-11e7-9296-cec278b6b50a', NULL)) as data
WHERE NOT EXISTS (SELECT * FROM example
WHERE (data::example)
IS NOT DISTINCT FROM example);
Run Code Online (Sandbox Code Playgroud)
对于一张大桌子,这需要几分钟。
您可以将记录转换为表的行类型:
INSERT INTO example
SELECT (data::example).*
FROM (
VALUES
('d853b5a8-d453-11e7-9296-cec278b6b50a', NULL),
('54514c89-f188-490a-abbb-268f9154ab2c', 42)
) as data;
Run Code Online (Sandbox Code Playgroud)
data::example将完整行强制转换为类型为 的记录example。在(...).*然后转向到这一点在表型定义的列example
| 归档时间: |
|
| 查看次数: |
2264 次 |
| 最近记录: |