4

このシーケンスが 2 ずつインクリメントされる理由がわかりません。

1ずつインクリメントするシーケンスにエラーはありますか? テーブル「food」に主キーの値を挿入するには、これが必要です。

CREATE SEQUENCE food_id_ai START WITH 1 INCREMENT BY 1 CACHE 100;

create table food(
    food_id  integer,
    f_name   varchar(30) not null,
    category varchar(30) not null,
    price    number(4),
    amount   number(4)  
);

alter table food add constraint fpk primary key(food_id);

CREATE OR REPLACE TRIGGER insert_into_food
  BEFORE INSERT ON food
  FOR EACH ROW
BEGIN
  :new.food_id:= food_id_ai.nextval;
END;
/

insert into food values(food_id_ai.nextval,'ruchi', 'chanachur' , 8, 50);
insert into food values(food_id_ai.nextval,'chips', 'chips' , 8, 50);
insert into food values(food_id_ai.nextval,'aeromatic', 'soap' , 8, 50);
insert into food values(food_id_ai.nextval,'handwash', 'toyletries', 8, 50);
insert into food values(food_id_ai.nextval,'tissue', 'toyletries' , 8, 50);
4

2 に答える 2

4

INSERTステートメントと、各行に対して起動されるトリガーの両方でシーケンスにアクセスしているため、もちろん、2 ずつインクリメントされます。

1 つ選択します。
実行する可能性のある各挿入ステートメントでシーケンスを指定することを覚えておく必要がないため、トリガーベースのものを選びます。

その場合、挿入する列を明示的にリストする必要がありますVALUES

INSERT INTO food (f_name, category, price, amount)
VALUES ('ruchi', 'chanachur' , 8, 50);
于 2015-08-21T19:27:06.780 に答える
3

これを修正するには、2 つのオプションがあります。

  1. insert ステートメントを次のように変更します。

    insert into food (f_name, category,price , amount)
    values ('ruchi', 'chanachur' , 8, 50);
    
  2. または、トリガーを次のように変更します。

    CREATE OR REPLACE TRIGGER insert_into_food
    BEFORE INSERT ON food
    FOR EACH ROW
    BEGIN
      if :new.food_id is null then 
        :new.food_id:= food_id_ai.nextval;
      end if;
    END;
    /
    
于 2015-08-22T12:22:24.857 に答える