3

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

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".
4

2 回答 2

4

id是具有默认值的主键1

在第一条记录中,由于您没有明确提及 的值id,因此它已插入 1。但是您不能有任何其他记录,id = 1因为id它是主键。

使用语句:

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

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

insert into Customers(id, Name, LastName) values (nextval('<seq_name>'), <name>, <lastname>);
于 2013-02-06T10:56:13.967 回答
4

由于您的触发代码是

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

并且,正如@Orangecrush 发布的那样,您将默认值设置为 1,永远不会生成唯一 ID。所以你应该尽量省略 ddl 中的默认值。

于 2013-02-06T11:01:26.950 回答