|
|
Question : How update primary key
|
|
Hi, I've these tables:
CREATE TABLE T_COD ( NAME VARCHAR2(100 BYTE), COD_ID VARCHAR2(8 BYTE) );
ALTER TABLE T_COD ADD (CONSTRAINT T_COD_PK PRIMARY KEY (COD_ID));
INSERT INTO T_COD ( NAME, COD_ID ) VALUES ('AA', 'C01'); INSERT INTO T_COD ( NAME, COD_ID ) VALUES ('BB', 'C02'); commit; CREATE TABLE ANAC ( COD_ID VARCHAR2(8 BYTE), NAME VARCHAR2(100 BYTE) );
ALTER TABLE ANAC ADD (CONSTRAINT ANAC_COD_ID FOREIGN KEY (COD_ID) REFERENCES T_COD (COD_ID)); INSERT INTO ANAC ( COD_ID, NAME ) VALUES ('C01', 'AAAAA'); INSERT INTO ANAC ( COD_ID, NAME ) VALUES ('C02', 'BBBBB'); commit; CREATE TABLE ANAC2 ( COD_ID VARCHAR2(8 BYTE), NAME VARCHAR2(100 BYTE) );
ALTER TABLE ANAC2 ADD (CONSTRAINT ANAC2_COD_ID FOREIGN KEY (COD_ID) REFERENCES T_COD (COD_ID)); INSERT INTO ANAC2 ( COD_ID, NAME ) VALUES ('C01', 'A'); INSERT INTO ANAC2 ( COD_ID, NAME ) VALUES ('C02', 'V'); commit;
CREATE TABLE T_FL ( NAME VARCHAR2(25 BYTE), COD_ID VARCHAR2(8 BYTE), FL_ID VARCHAR2(4 BYTE) );
ALTER TABLE T_FL ADD (CONSTRAINT T_FL_PK PRIMARY KEY (COD_ID, FL_ID));
ALTER TABLE T_FL ADD (CONSTRAINT FL_COD_ID FOREIGN KEY (COD_ID) REFERENCES T_COD (COD_ID));
INSERT INTO T_FL ( NAME, COD_ID, FL_ID ) VALUES ('X', 'C01', 'T0'); INSERT INTO T_FL ( NAME, COD_ID, FL_ID ) VALUES ('Y', 'C02', 'T1'); commit;
CREATE TABLE T_RM ( NAME VARCHAR2(60 BYTE), COD_ID VARCHAR2(8 BYTE), FL_ID VARCHAR2(4 BYTE), RM_ID VARCHAR2(8 BYTE) );
ALTER TABLE T_RM ADD (CONSTRAINT T_RM_PK PRIMARY KEY (COD_ID, FL_ID, RM_ID));
ALTER TABLE T_RM ADD (CONSTRAINT T_RM_COD_ID FOREIGN KEY (COD_ID) REFERENCES T_COD(COD_ID));
ALTER TABLE T_RM ADD (CONSTRAINT RM_T_FL_ID FOREIGN KEY (COD_ID, FL_ID) REFERENCES T_FL (COD_ID,FL_ID));
INSERT INTO T_RM ( NAME, COD_ID, FL_ID, RM_ID ) VALUES ('XX', 'C01', 'T0', 'P0'); INSERT INTO T_RM ( NAME, COD_ID, FL_ID, RM_ID ) VALUES ('YY', 'C02', 'T1', 'P1'); commit;
I need update automatically COD_ID:
UPDATE T_COD SET COD_ID = 'B01' WHERE COD_ID = 'C01';
but I get this error:
ORA-02292: integrity constraint (ANAC_COD_ID) violated - child record found
I'd like to create a trigger to update automatically COD_ID
I created before this stored procedure:
CREATE OR REPLACE PROCEDURE UPD_COD_ID (OLD_COD_ID VARCHAR2, NEW_COD_ID VARCHAR2) AS
BEGIN
INSERT INTO T_COD ( NAME, COD_ID ) SELECT NAME, NEW_COD_ID FROM T_COD WHERE COD_ID = OLD_COD_ID;
COMMIT;
UPDATE ANAC SET COD_ID = NEW_COD_ID WHERE COD_ID = OLD_COD_ID;
UPDATE ANAC2 SET COD_ID = NEW_COD_ID WHERE COD_ID = OLD_COD_ID;
COMMIT;
INSERT INTO T_FL ( NAME, COD_ID, FL_ID ) SELECT NAME, NEW_COD_ID, FL_ID FROM T_FL WHERE COD_ID=OLD_COD_ID;
INSERT INTO T_RM ( NAME, COD_ID, FL_ID, RM_ID ) SELECT NAME, NEW_COD_ID, FL_ID, RM_ID FROM T_RM WHERE COD_ID=OLD_COD_ID;
COMMIT;
DELETE T_RM WHERE COD_ID=OLD_COD_ID;
DELETE T_FL WHERE COD_ID=OLD_COD_ID;
DELETE T_COD WHERE COD_ID = OLD_COD_ID;
COMMIT; EXCEPTION WHEN OTHERS THEN RAISE; END; /
and after this trigger:
CREATE OR REPLACE TRIGGER TRG_UPD_COD_ID BEFORE UPDATE OF COD_ID ON T_COD FOR EACH ROW
BEGIN UPD_COD_ID (:OLD.COD_ID, :NEW.COD_ID); END; /
UPDATE T_COD SET COD_ID = 'B01' WHERE COD_ID = 'C01';
but I get this error:
ORA-04091: table T_COD is mutating, trigger/function may not see it ORA-06512: at "UPD_COD_ID", line 156 ORA-06512: at "TRG_UPD_COD_ID", line 2 ORA-04088: error during execution of trigger 'TRG_UPD_COD_ID'
How can I update automatically COD_ID?
Thanks in advance!
|
Answer : How update primary key
|
|
Here is a simple example.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
|
SQL> create table t1 (y number, constraint t1_pk primary key (y));
Table created.
SQL> create table t2 (y number, constraint t2_ref foreign key (y) references t1(y) deferrable initially immediate);
Table created.
SQL> insert into t1 values (1);
1 row created.
SQL> insert into t2 values (1);
1 row created.
-- If you update here, you will get a constraint violation.
SQL> set constraint t2_ref deferred;
Constraint set.
SQL> update t1 set y = 2;
1 row updated.
-- If you commit here you will get a constraint violation.
SQL> update t2 set y = 2;
1 row updated.
SQL> commit;
Commit complete.
|
Open in New Window
Select All
|
|
|
|
|