为了在第二个表中自动添加一列以通过唯一索引将其绑定到第一个表,我有如下规则:
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时,行触发器也会自动增加序列。