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
Random Solutions  
 
programming4us programming4us