我通过以下代码创建了客户表:
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".
答案 0 :(得分:4)
id
是主键,默认值为1
。
在第一条记录中,由于您没有明确提及id
的值,因此它已插入1.但由于id = 1
是id
,因此您不能拥有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中的默认值。