postgresql – 使用规则插入辅助表自动递增序列

postgresql – 使用规则插入辅助表自动递增序列,第1张

概述要在第二个表中自动添加列以通过唯一索引将其绑定到第一个表,我有一个如下规则: CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSOINSERT INTO lastlogin (id) VALUES (NEW.userid); 如果user.userid是一个整数,这可以正常工作.但是,如果它是一个序列(例如,类型为seri @H_502_0@ @H_502_0@ 要在第二个表中自动添加列以通过唯一索引将其绑定到第一个表,我有一个如下规则:

CREATE OR REPLACE RulE auto_insert AS ON INSERT TO user DO ALSOINSERT INTO lastlogin (ID) VALUES (NEW.userID);

如果user.userID是一个整数,这可以正常工作.但是,如果它是一个序列(例如,类型为serial或bigserial),那么插入到lastlogin表中的是下一个序列ID.所以这个命令:

INSERT INTO user (username) VALUES ('john');

将列[1,’john’,…]插入用户,但将列[2,…]插入lastlogin.以下2个解决方法确实有效,但第二个解决方案消耗了两倍的序列号,因为序列仍然是自动递增的:

CREATE OR REPLACE RulE auto_insert AS ON INSERT TO user DO ALSOINSERT INTO lastlogin (ID) VALUES (lastval());CREATE OR REPLACE RulE auto_insert AS ON INSERT TO user DO ALSOINSERT INTO lastlogin (ID) VALUES (NEW.userID-1);

不幸的是,如果我插入多行,解决方法不起作用:

INSERT INTO user (username) VALUES ('john'),('mary');

第一个解决方法将使用相同的ID,第二个解决方法是所有类型的搞砸.

是否可以通过postgresql规则执行此 *** 作,或者我应该自己第二次插入lastlogin或使用行触发器?实际上,我认为当我访问NEW.userID时,行触发器也会自动递增序列.

解决方法 完全忘记规则.他们很糟糕.

触发器对你来说更好.在99%的情况下,有人认为他需要一个规则.试试这个:

create table users (  userID serial primary key,username text);create table lastlogin (  userID int primary key references users(userID),lastlogin_time timestamp with time zone);create or replace function lastlogin_create_ID() returns trigger as $$  begin    insert into lastlogin (userID) values (NEW.userID);    return NEW;  end;$$language plpgsql volatile;create trigger lastlogin_create_ID  after insert on users for each row execute procedure lastlogin_create_ID();

然后:

insert into users (username) values ('foo'),('bar');select * from users;
 userID | username --------+----------      1 | foo      2 | bar(2 rows)
select * from lastlogin;
 userID | lastlogin_time --------+----------------      1 |       2 | (2 rows)
@H_502_0@ 总结

以上是内存溢出为你收集整理的postgresql – 使用规则插入辅助表自动递增序列全部内容,希望文章能够帮你解决postgresql – 使用规则插入辅助表自动递增序列所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/sjk/1160559.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存