Oracle SQL - 触发器插入 table 从序列中传递空值
Oracle SQL - Trigger inserting into table passing null value from sequence
我有两个table、TABLE_A和TABLE_B。当某些东西被插入 TABLE_A 时,有一个触发器也会将数据插入 TABLE_B。 TABLE_A 有一个使用序列填充的 ID 列。然后这个id也被插入到TABLE_B中。这是整个 DDL:
CREATE TABLE "TABLE_A"
( "ID" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN1" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN2" NUMBER(4,0) NOT NULL ENABLE
)
/
CREATE TABLE "TABLE_B"
( "ID" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN1" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN2" NUMBER(4,0) NOT NULL ENABLE
)
/
CREATE UNIQUE INDEX "AID_PK" ON "TABLE_A" ("ID")
/
ALTER TABLE "TABLE_A" ADD CONSTRAINT "AID_PK" PRIMARY KEY ("ID")
USING INDEX "AID_PK" ENABLE
/
create or replace TRIGGER my_trigger
BEFORE INSERT OR UPDATE OR DELETE ON TABLE_A
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO TABLE_B(
ID,
COLUMN1,
COLUMN2)
VALUES(
:new.ID,
:new.COLUMN1,
:new.COLUMN2);
END IF;
END;
/
ALTER TRIGGER "my_trigger" ENABLE
/
CREATE SEQUENCE "MY_SEQ" MINVALUE 1 MAXVALUE 999999999999999 INCREMENT BY 1 START WITH 5002 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL;
/
CREATE OR REPLACE EDITIONABLE TRIGGER "MYSEQ_SEQ_IOT"
before insert on table_a
for each row
begin
select MY_SEQ.nextval into :new.id from dual;
end;
/
ALTER TRIGGER "MYSEQ_SEQ_IOT" ENABLE
/
现在当我运行这条语句时:
INSERT INTO PER_ART(
COLUMN1,
COLUMN2
)
VALUES(
1111111,
2222222);
我收到这个错误:
ORA-01400: cannot insert NULL into ("TABLE_B"."ID")
ORA-06512: at "my_trigger", line 7
ORA-04088: error during execution of trigger 'my_trigger'
为什么应该填充序列时 ID 为空?
你的两个触发器触发的顺序是不确定的。在我看来,最好的解决方案是只使用一个触发器:
create or replace TRIGGER my_trigger
BEFORE INSERT ON TABLE_A
FOR EACH ROW
BEGIN
select MY_SEQ.nextval
into :new.id
from dual;
INSERT INTO TABLE_B(
ID,
COLUMN1,
COLUMN2)
VALUES(
:new.ID, -- Or use MY_SEQ.curreval
:new.COLUMN1,
:new.COLUMN2);
END;
如果出于某种原因必须有两个触发器,则可以使用 CREATE TRIGGER 语句的 FOLLOWS 和 PRECEDES 子句控制它们的触发顺序。有关控制触发顺序的详细信息,请参阅 the documentation。
我有两个table、TABLE_A和TABLE_B。当某些东西被插入 TABLE_A 时,有一个触发器也会将数据插入 TABLE_B。 TABLE_A 有一个使用序列填充的 ID 列。然后这个id也被插入到TABLE_B中。这是整个 DDL:
CREATE TABLE "TABLE_A"
( "ID" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN1" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN2" NUMBER(4,0) NOT NULL ENABLE
)
/
CREATE TABLE "TABLE_B"
( "ID" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN1" NUMBER(8,0) NOT NULL ENABLE,
"COLUMN2" NUMBER(4,0) NOT NULL ENABLE
)
/
CREATE UNIQUE INDEX "AID_PK" ON "TABLE_A" ("ID")
/
ALTER TABLE "TABLE_A" ADD CONSTRAINT "AID_PK" PRIMARY KEY ("ID")
USING INDEX "AID_PK" ENABLE
/
create or replace TRIGGER my_trigger
BEFORE INSERT OR UPDATE OR DELETE ON TABLE_A
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO TABLE_B(
ID,
COLUMN1,
COLUMN2)
VALUES(
:new.ID,
:new.COLUMN1,
:new.COLUMN2);
END IF;
END;
/
ALTER TRIGGER "my_trigger" ENABLE
/
CREATE SEQUENCE "MY_SEQ" MINVALUE 1 MAXVALUE 999999999999999 INCREMENT BY 1 START WITH 5002 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL;
/
CREATE OR REPLACE EDITIONABLE TRIGGER "MYSEQ_SEQ_IOT"
before insert on table_a
for each row
begin
select MY_SEQ.nextval into :new.id from dual;
end;
/
ALTER TRIGGER "MYSEQ_SEQ_IOT" ENABLE
/
现在当我运行这条语句时:
INSERT INTO PER_ART(
COLUMN1,
COLUMN2
)
VALUES(
1111111,
2222222);
我收到这个错误:
ORA-01400: cannot insert NULL into ("TABLE_B"."ID")
ORA-06512: at "my_trigger", line 7
ORA-04088: error during execution of trigger 'my_trigger'
为什么应该填充序列时 ID 为空?
你的两个触发器触发的顺序是不确定的。在我看来,最好的解决方案是只使用一个触发器:
create or replace TRIGGER my_trigger
BEFORE INSERT ON TABLE_A
FOR EACH ROW
BEGIN
select MY_SEQ.nextval
into :new.id
from dual;
INSERT INTO TABLE_B(
ID,
COLUMN1,
COLUMN2)
VALUES(
:new.ID, -- Or use MY_SEQ.curreval
:new.COLUMN1,
:new.COLUMN2);
END;
如果出于某种原因必须有两个触发器,则可以使用 CREATE TRIGGER 语句的 FOLLOWS 和 PRECEDES 子句控制它们的触发顺序。有关控制触发顺序的详细信息,请参阅 the documentation。