【发布时间】:2011-01-16 05:42:09
【问题描述】:
要自动在第二个表中添加一列以通过唯一索引将其绑定到第一个表,我有如下规则:
CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (NEW.userid);
如果 user.userid 是一个整数,这可以正常工作。但是,如果它是一个序列(例如,键入 serial 或 bigserial),则插入到表 lastlogin 中的是下一个序列 id。所以这个命令:
INSERT INTO user (username) VALUES ('john');
会将列 [1, 'john', ...] 插入 user,但将列 [2, ...] 插入 lastlogin。以下 2 种解决方法确实有效,但第二种解决方法会消耗两倍的序列,因为序列仍在自动递增:
CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (lastval());
CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (NEW.userid-1);
不幸的是,如果我要插入多行,解决方法将不起作用:
INSERT INTO user (username) VALUES ('john'), ('mary');
第一个解决方法将使用相同的 id,而第二个解决方法则是搞砸了。
是否可以通过 postgresql 规则执行此操作,还是我应该自己第二次插入 lastlogin 或使用行触发器?实际上,我认为当我访问 NEW.userid 时,行触发器也会自动增加序列。
【问题讨论】:
标签: postgresql rules