使用触发器将 postgres SQL 插入语句拆分为 2 个表
Posted
技术标签:
【中文标题】使用触发器将 postgres SQL 插入语句拆分为 2 个表【英文标题】:Splitting a postgres SQL insert statement into 2 tables using triggers 【发布时间】:2016-12-26 23:12:43 【问题描述】:是否可以使用 postgres 触发器将 INSERT 语句拆分为 2 个表?所以如果你做insert into testtable (col1, col2) values (val1a, val1b), (val2a, val2b)
,它可以用触发器翻译成类似的东西
insert into testtable (col1) values (val1a), (val1b)
insert into anothertable (col2) values (val2a), (val2b)
即使原始 SQL INSERT 看起来 col2
应该存在于 testtable
上,testtable
基本上是否可能没有 col2
?
如何使用触发器来实现?
【问题讨论】:
我怀疑你的意思是insert into firsttable (col1) values (val1a), (val2a); insert into secondtable (col2) values (val1b), (val2b)
...
【参考方案1】:
您可以使用带有触发器或规则的VIEW
来重定向INSERT
。
或者您可以在单个 SQL 语句中使用数据修改 CTE 来完成。
WITH input(col1, col2) AS (
VALUES
(text 'val1a', text 'val1b') -- explicit type cast in first row
, ('val2a', 'val2b')
)
, ins1 AS (
INSERT INTO testtable (col1)
SELECT col1 FROM input
)
INSERT INTO anothertable (col2)
SELECT col2 FROM input;
通常,还可以存储输入行的“val1a”和“val1b”之间的连接以某种方式。
您可能希望使用 RETURNING
子句从第一个表中获取串行 PK 并将其存储在第二个表中。
相关:
PostgreSQL multi INSERT...RETURNING with multiple columns Combining INSERT statements in a data-modifying CTE with a CASE expression INSERT rows into multiple tables in a single query, selecting from an involved table【讨论】:
我对您链接到的页面中的 RULE 方法感兴趣,但您说规则可能很棘手。我阅读了您建议阅读的页面,但我不确定一些事情。如果该规则在 INSTEAD 子句中有几个不同的语句,那么所有这些语句都以事务方式执行吗?所以如果一个失败了,他们都失败了? @user779159:是的。如果同一事务中的anything 引发异常,则整个 事务将回滚。对于任意数量的语句,规则始终是原子的。以上是关于使用触发器将 postgres SQL 插入语句拆分为 2 个表的主要内容,如果未能解决你的问题,请参考以下文章