【发布时间】:2014-10-09 00:04:55
【问题描述】:
使用 Postgres 9.3:
我试图在另一个表上执行插入时自动填充一个表。这似乎对规则很有用,但是在将规则添加到第一个表后,我不再能够使用可写 CTE 对第二个表执行插入操作。这是一个例子:
CREATE TABLE foo (
id INT PRIMARY KEY
);
CREATE TABLE bar (
id INT PRIMARY KEY REFERENCES foo
);
CREATE RULE insertFoo AS ON INSERT TO foo DO INSERT INTO bar VALUES (NEW.id);
WITH a AS (SELECT * FROM (VALUES (1), (2)) b)
INSERT INTO foo SELECT * FROM a
运行时出现错误
"错误:无法在被规则重写的查询中使用 WITH 成多个查询”。
我已经搜索了那个错误字符串,但我只能找到指向源代码的链接。我知道我可以使用行级触发器执行上述操作,但似乎我应该能够在语句级别执行此操作。为什么我不能使用可写 CTE,当这样的查询(在这种情况下)可以很容易地重写为:
INSERT INTO foo SELECT * FROM (VALUES (1), (2)) a
除了 1) 使用规则来阻止使用“with”查询或 2) 使用行级触发器之外,有没有人知道另一种方法可以完成我试图做的事情?谢谢,
【问题讨论】:
-
为什么不想使用触发器?
-
我的数据库经验只有大约 5 个月,所以每当我遇到一个我无法找到我真正喜欢的解决方案的问题时,我想我应该请教专家,这样我才能了解各种选择。对于这么简单的事情,出于性能原因,一条规则似乎是可行的方法,但我不喜欢无法在查询中使用可写 CTE 的限制。
-
我应该补充一点,我计划使用行级触发器作为首选解决方案,除非有人在 SO 提供更好的选择。
-
仅供参考:来源可以在
src/backend/rewrite/rewriteHandler.c中找到