3

次のコードを使用して Customers テーブルを作成しました。

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 ; ^

しかし、次のような2行目を挿入すると:

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

エラー以下になります:

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

2 に答える 2

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 に答える
4

idデフォルト値を持つ主キーです1

最初のレコードでは、 の値を明示的に言及していないため、 1 が挿入されています。ただし、 が主キーであるためid、他のレコードを持つことはできません。id = 1id

次のステートメントを使用します。

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 に答える