Firebird autoIncrement问题

时间:2013-02-06 10:51:10

标签: sql firebird firebird2.5

我通过以下代码创建了客户表:

CREATE TABLE CUSTOMERS (
ID INTEGER DEFAULT 1 NOT NULL,
"NAME" VARCHAR(30) CHARACTER SET UTF8 COLLATE UTF8,
"LASTNAME" VARCHAR(30) CHARACTER SET UTF8 COLLATE UTF8);


ALTER TABLE CUSTOMERS ADD PRIMARY KEY (ID);


SET TERM ^ ;

CREATE TRIGGER BI_CUSTOMERS_ID FOR CUSTOMERS
ACTIVE BEFORE INSERT
POSITION 1
AS
BEGIN
 IF (NEW.ID IS NULL) THEN
  NEW.ID = GEN_ID(CUSTOMERS_ID_GEN, 1);
END^

SET TERM ; ^

但是当我插入第二行时:

insert into Customers(Name,LastName) values('Hamed','Kamrava');

低于错误:

Violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "CUSTOMERS".

2 个答案:

答案 0 :(得分:4)

id是主键,默认值为1

在第一条记录中,由于您没有明确提及id的值,因此它已插入1.但由于id = 1id,因此您不能拥有insert into Customers(id, Name, LastName) values (2, 'Hamed', 'Kamrava'); 的任何其他记录主键。

使用声明:

insert into Customers(id, Name, LastName) values (nextval('<seq_name>'), <name>, <lastname>);

这应该插入记录。如果您不想对每行的ID值进行硬编码,建议您create a sequence,然后在插入期间使用,

{{1}}

答案 1 :(得分:4)

因为您的触发器代码是

 IF (NEW.ID IS NULL) THEN
  NEW.ID = GEN_ID(CUSTOMERS_ID_GEN, 1);

并且,当@Orangecrush发布时,您将默认值设置为1,从不生成唯一ID。所以你应该尝试省略ddl中的默认值。