C PgAdmin的触发增量

C PgAdmin的触发增量,c,postgresql,triggers,increment,C,Postgresql,Triggers,Increment,所以我需要为我的数据库定义一些触发器。到目前为止,我只有一个。 我先解释一下,然后再发布代码 所以我有一个表“Persons”,每当我在Persons中插入一些东西时,我都会设置一个触发器,IdPerson(pk)会每次递增。事情是这样的 create sequence seqpersoane START WITH 9913 INCREMENT BY 1 MINVALUE 9912 MAXVALUE 9999 NO CYCLE; CREATE OR REPLACE FUNCTION trg_

所以我需要为我的数据库定义一些触发器。到目前为止,我只有一个。 我先解释一下,然后再发布代码

所以我有一个表“Persons”,每当我在Persons中插入一些东西时,我都会设置一个触发器,IdPerson(pk)会每次递增。事情是这样的

create sequence seqpersoane START WITH 9913 INCREMENT BY 1 MINVALUE 9912 
MAXVALUE 9999 NO CYCLE;

CREATE OR REPLACE FUNCTION trg_persoane()
RETURNS TRIGGER AS $trg_persoane$
BEGIN
NEW.idpersoana = NEXTVAL('seqpersoane') ;
RETURN NEW ;
END ;
$trg_persoane$ LANGUAGE plpgsql ;

CREATE TRIGGER trg_persoane
BEFORE INSERT ON persoane
for each row execute procedure trg_persoane();

INSERT INTO persoane VALUES (1221, 'Hanu Ana-Maria', '06929395832', 
'romana', 'hanu@gmail.com', '1995-05-28');   
最后一个插件要测试,并且正在工作。我拿到了9913

然后,我有一个带有pk IDSTUDENT的表“Students”(IDSTUDENT=idperson from table PERSONS,因为,你知道,学生也是人,具有相同的ID)

现在,我不知道代码,每当我插入一个人(姓名、电话、电子邮件和其他一般详细信息)时,我也必须插入具有与个人相同的递增ID的学生

所以我插入了idperson 9914的人。接下来,我插入student,其增量代码与我本人使用的代码相同(增量1从9914开始)。所以两者都有相同的递增ID,因为它们都以相同的数字开头

但是,假设我没有拼写我想插入的人的名字,我得到了一个IDPERSON 9915。我删除了此人,并再次插入另一个ID PERSON 9916。问题是IDSTUDENT将保持在9915,并且它违反了FK

帮手。抱歉发了这么长的邮件。最后我给你一个土豆

编辑:

如果我在桌上的学生和桌上的员工身上都尝试这个方法

create sequence seqStudent START WITH 9913 INCREMENT BY 1 MINVALUE 9912 
MAXVALUE 9999 NO CYCLE; 
CREATE OR REPLACE FUNCTION trg_student()
RETURNS TRIGGER AS $trg_student$
BEGIN 
NEW.idstudent = CURRVAL('seqpersoane') ;
RETURN NEW ; 
END ; 
$trg_student$ LANGUAGE plpgsql ; 


CREATE TRIGGER trg_student 
BEFORE INSERT ON student 
for each row execute procedure trg_student();

外键不应使用单独的序列。如果在一个事务中执行插入操作(或者更确切地说:在同一个会话中),可以使用
SELECT currval('seqpersoane')
查找最后生成的序列值(通过
SELECT nextval('seqpersoane')
调用)。另一个选项(或者,如果您在不同的会话中插入这些实体),您可以使用返回idperson的
insert-INTO-persoane-VALUES(…)语法来获取为此人生成的ID。您可以稍后使用它来插入其他表的相关记录。嗯。。逻辑上,当我选择删除一个人拼写错误的插入内容时,下一个idperson将与删除的idperson相似。在这种情况下,来自学生和个人的序列都会有一个相似的id。出于好奇,我对这个有点陌生。如果你能为table STUDENT发布我的代码应该是什么样子的,我会很感激它是f.ex。通常的设置。重点是。。我使用另一个名为EMPLOYEE的表,它的概念与STUDENT相同。。ideemployee=idperson。。如果我插入一个人,那么我会添加两个学生,他们都有相同的ID。但是当我插入另一个人时,这个人将有IDPERSON+2,而IdeEmployee只有+1。又是一次违规,因为我是雇员idperson..@pozs观看编辑。