加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 15:59:22 所属栏目:百科 来源:网络整理
导读:要在第二个表中自动添加列以通过唯一索引将其绑定到第一个表,我有一个如下规则: CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSOINSERT INTO lastlogin (id) VALUES (NEW.userid); 如果user.userid是一个整数,这可以正常工作.但是,如果它
要在第二个表中自动添加列以通过唯一索引将其绑定到第一个表,我有一个如下规则:

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’,…]插入用户,但将列[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时,行触发器也会自动递增序列.

解决方法

完全忘记规则.他们很糟糕.

触发器对你来说更好.在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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读