Creating a table with a primary key that has one to may relationship with an existing table in oracle

StackOverflow https://stackoverflow.com/questions/19500676

Question

I have a table t1 that has many the following records

ID NAME TITLE ....

1  abc  X1
2  xyz  X1
3  qwe  X1
4  asd  X2
5  pqr  X2

I want to create a new table t2 that has a primary key and it references a new foreign key in t1. Also, the information of the column "title" is distinct in t2 and hence ,any records added in t2 should be reflected in t1 and the deletes should be cascaded from t1 to t2.

I have done the following :

create table t2 AS SELECT distinct (title) FROM t1;

ALTER TABLE t2
ADD (s_id,column1,column 2);

alter table t2 add primary key (s_id);

create sequence s_seq
start with 1
increment by 1
nomaxvalue;

update t2 set s_id=s_seq.nextval;


ALTER TABLE t1
add constraint fk_s_id
FOREIGN KEY (f_t2)
REFERENCES t2(s_id) on delete cascade;

This doesnt work on the cascades and inserts. PLease help.

Était-ce utile?

La solution

I was missing how you create f_t2 which needs to be added to t1 at one point. So I added and populated the column f_t2 and it worked.

ALTER TABLE t1
ADD (f_t2 number);
update t1 set f_t2 = (select s_id from t2 where t2.title = t1.title);

Running the following produced the desired result.

drop table t1;
create table t1 (id number,name varchar2(100), title varchar2(100));
insert into t1 values (1, 'abc',  'X1');
insert into t1 values (2, 'xyz',  'X1');
insert into t1 values (3, 'qwe',  'X1');
insert into t1 values (4, 'asd',  'X2');
insert into t1 values (5, 'pqr',  'X2');
drop table t2;
create table t2 AS SELECT distinct (title) FROM t1;
ALTER TABLE t2
ADD (s_id number,column1 varchar2(10),column2 varchar2(20));
drop sequence s_seq;
create sequence s_seq
start with 1
increment by 1
nomaxvalue;
update t2 set s_id=s_seq.nextval;
alter table t2 add primary key (s_id);
ALTER TABLE t1
ADD (f_t2 number);
update t1 set f_t2 = (select s_id from t2 where t2.title = t1.title);
select * from t1;
select * from t2;
ALTER TABLE t1
add constraint fk_s_id
FOREIGN KEY (f_t2)
REFERENCES t2(s_id) on delete cascade;
delete from t2 where title='X2';
select * from t1;
select * from t2;

Output:

table T1 dropped.
table T1 created.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
1 rows inserted.
table T2 dropped.
table T2 created.
table T2 altered.
sequence S_SEQ dropped.
sequence S_SEQ created.
2 rows updated.
table T2 altered.
table T1 altered.
5 rows updated.
        ID NAME                                                                                                 TITLE                                                                                                      F_T2
---------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------
         1 abc                                                                                                  X1                                                                                                            1 
         2 xyz                                                                                                  X1                                                                                                            1 
         3 qwe                                                                                                  X1                                                                                                            1 
         4 asd                                                                                                  X2                                                                                                            2 
         5 pqr                                                                                                  X2                                                                                                            2 

TITLE                                                                                                      S_ID COLUMN1    COLUMN2            
---------------------------------------------------------------------------------------------------- ---------- ---------- --------------------
X1                                                                                                            1                                 
X2                                                                                                            2                                 

table T1 altered.
1 rows deleted. --- DELETE in T2 affects T1
-- THIS IS T1:
            ID NAME                                                                                                 TITLE                                                                                                      F_T2
    ---------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------
             1 abc                                                                                                  X1                                                                                                            1 
             2 xyz                                                                                              

    X1                                                                                                            1 
             3 qwe                                                                                                  X1                                                                                                            1 
-- THIS IS T2:    
    TITLE                                                                                                      S_ID COLUMN1    COLUMN2            
    ---------------------------------------------------------------------------------------------------- ---------- ---------- --------------------
    X1                                                                                                            1                                 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top