oracle學習筆記 十七 外來鍵約束

2021-09-28 13:47:43 字數 3758 閱讀 4147

建立兩張表,新增外來鍵約束:customers(使用者表,一的一方),orders(訂單表,多的一方);

sql> create table customers(

2 id number(3) primary key,

3 name varchar2(4) not null unique

4 );

表已建立。

sql> insert into customers(id,name) values(1,'a');

已建立 1 行。

sql> insert into customers(id,name) values(2,'b');

已建立 1 行。

一般情況下:一對多的時候,外來鍵放在多的一方;

sql> create table orders(

2 id number(3) primary key,

3 isbn varchar2(6) not null unique, -- 訂單號

4 price number(3) not null,

5 cid number(3), -- 是乙個外來鍵字段,用來引用 customers 表的 id

6 -- 建立約束需要使用關鍵字 constraint

7 -- cid_fk 是約束名稱

8 -- foreign key(cid) 指定 cid 欄位為 外來鍵字段

9 -- references customers(id) 引用 customers 表的 id

10 constraint cid_fk foreign key(cid) references customers(id)

11 );

表已建立。

sql> insert into orders(id,isbn,price,cid) values(1,'isbn10',10,1);

已建立 1 行。

sql> insert into orders(id,isbn,price,cid) values(2,'isbn20',20,1) -- 1,2 號訂單對應 客戶1;

已建立 1 行。

sql> insert into orders(id,isbn,price,cid) values(3,'isbn30',30,2);

已建立 1 行。

sql> insert into orders(id,isbn,price,cid) values(4,'isbn40',40,2) -- 3,4 號訂單對應 客戶2;

已建立 1 行。

要求:刪除客戶時,同時刪除該客戶對應的所有訂單;

預設情況下,由於外來鍵約束的存在,是無法刪除的:

sql> delete from customers where id = 1;

delete from customers where id = 1

*第 1 行出現錯誤:

ora-02292: 違反完整約束條件 (scott.cid_fk) - 已找到子記錄

可以通過建立表時,在外鍵約束上 新增級聯刪除實現:on delete cascade

sql> drop table orders purge;

表已刪除。

sql> create table orders(

2 id number(3) primary key,

3 isbn varchar2(6) not null unique, -- 訂單號

4 price number(3) not null,

5 cid number(3), -- 是乙個外來鍵字段,用來引用 customers 表的 id

6 -- 建立約束需要使用關鍵字 constraint

7 -- cid_fk 是約束名稱

8 -- foreign key(cid) 指定 cid 欄位為 外來鍵字段

9 -- references customers(id) 引用 customers 表的 id

10 -- on delete cascade 表示級聯刪除

11 constraint cid_fk foreign key(cid) references customers(id) on delete cascade

12 );

表已建立。

sql> insert into orders(id,isbn,price,cid) values(1,'isbn10',10,1);

已建立 1 行。

sql> insert into orders(id,isbn,price,cid) values(2,'isbn20',20,1) -- 1,2 號訂單對應 客戶1;

已建立 1 行。

sql> insert into orders(id,isbn,price,cid) values(3,'isbn30',30,2);

已建立 1 行。

sql> insert into orders(id,isbn,price,cid) values(4,'isbn40',40,2) -- 3,4 號訂單對應 客戶2;

已建立 1 行。

給外來鍵新增 級聯刪除 之後,再刪除客戶資料,就可以將對應的 訂單資料全部刪除了:

sql> delete from customers where id = 1;

已刪除 1 行。

要求:刪除客戶時,不刪除客戶對應的所有訂單,而是將該客戶對應訂單的 外健設定為 null;

通過建立表時,在外鍵約束上新增 on delete set null 實現:

sql> create table orders(

2 id number(3) primary key,

3 isbn varchar2(6) not null unique, -- 訂單號

4 price number(3) not null,

5 cid number(3), -- 是乙個外來鍵字段,用來引用 customers 表的 id

6 -- 建立約束需要使用關鍵字 constraint

7 -- cid_fk 是約束名稱

8 -- foreign key(cid) 指定 cid 欄位為 外來鍵字段

9 -- references customers(id) 引用 customers 表的 id

10 -- on delete set null 表示刪除客戶時,將客戶對應的訂單外來鍵設定 null

11 constraint cid_fk foreign key(cid) references customers(id) on delete set null

12 );

表已建立。

sql> insert into orders(id,isbn,price,cid) values(3,'isbn30',30,2);

已建立 1 行。

sql> insert into orders(id,isbn,price,cid) values(4,'isbn40',40,2) -- 3,4 號訂單對應 客戶2;

已建立 1 行。

然後再刪除客戶時,對應的訂單就不會被刪除了,只會將外來鍵設定為 null:

sql> delete from customers where id = 2;

已刪除 1 行。

Oracle學習筆記(十七)

103 date,timestamp,interval 這三個是oracle 處理時間方面的型別。從字面上面,就可以很清楚的明白這其中的區別。date 是正常的時間。timestamp 是時間戳。而interval 則是表示一段時間。覺得分割的好細緻 還有一點需要明白的是,在資料庫中,儲存的時間無論...

django admin 新增使用者出現外來鍵約束錯誤

今天在做mxonline專案時,註冊了使用者表進admin後,想在後台新增乙個使用者試試,結果出現了錯誤,經過一番搜尋發現以下兩個解決方法,不過我只用了一種 報錯資訊 integrityerror 1452,u cannot add or update a child row a foreign k...

oracle建表相關 包括主鍵索引和外來鍵約束

今天來聊一下oracle的建表語句,比如下面的 create table bbb info bbb id number 8 not null,aaa varchar2 8 null,bbb varchar2 8 null,ccc varchar2 8 null,ddd varchar2 8 null...