FOREIGN KEY(FK)
CONSTRAINT fk_外鍵名 FOREIGN KEY(列名) REFERENCES 表2名(列名)--一般表2的主鍵
先刪除 DROP TABLE MEMBER PURGE;
創建表-成員
CREATE TABLE MEMBER (
mid NUMBER ,
NAME VARCHAR2(20) NOT NULL,
--創建主鍵約束
CONSTRAINT PK_mid PRIMARY KEY(mid)
);
添加數據
INSERT INTO MEMBER(mid,NAME)VALUES(1,'張無忌'); INSERT INTO MEMBER(mid,NAME)VALUES(2,'張三豐');
創建另一張表建議表
CREATE TABLE advice(
adid NUMBER,
content CLOB NOT NULL,
mid NUMBER,
CONSTRAINT PK_adid PRIMARY KEY(adid)
);
為avvice添加數據
INSERT INTO advice(adid,content,mid)VALUES(1,'應該提倡內部溝通機制,設置總裁郵箱',1); INSERT INTO advice(adid,content,mid)VALUES(2,'為了公司內部良性發展,所有部門領導應該重新上崗',1); INSERT INTO advice(adid,content,mid)VALUES(3,'要多開展員工培訓活動,讓員工更加有歸屬感',1); INSERT INTO advice(adid,content,mid)VALUES(4,'應該開展多元化業務,更加滿足市場需求',2); INSERT INTO advice(adid,content,mid)VALUES(5,'大力發展技術部門,為本公司設計自己的ERP系統,適應電子化信息發展要求',2); COMMIT; --查詢advice表 SELECT * FROM advice;
查詢出每位成員的完整信息和所提出的意見數量
SELECT m.mid,m.name,COUNT(a.mid) FROM MEMBER m,advice a WHERE m.mid=a.mid GROUP BY m.mid,m.name; 可以看出可以正確統計,advice中的MID應該取值范圍應該由成員表中的mid的內容現在並沒有限制
在 advice中增加一條編號不在member中mid范圍內的數據
INSERT INTO advice(adid,content,mid) VALUES(6,'崗位職責透明化',99); --查詢advice表 SELECT * FROM advice; --可以添加成功
指定主-外鍵約束
--先刪除
DROP TABLE MEMBER PURGE; DROP TABLE advice PURGE;
創建同樣的表
創建表成員
CREATE TABLE MEMBER (
mid NUMBER ,
NAME VARCHAR2(20) NOT NULL,
--創建主鍵約束
CONSTRAINT PK_mid PRIMARY KEY(mid)
);
--創建另一張表建議表
CREATE TABLE advice(
adid NUMBER,
content CLOB NOT NULL,
mid NUMBER,
CONSTRAINT PK_adid PRIMARY KEY(adid),
CONSTRAINT FK_mid FOREIGN KEY(mid) REFERENCES MEMBER(mid)
);
--添加數據
INSERT INTO MEMBER(mid,NAME)VALUES(1,'劉楠');
INSERT INTO MEMBER(mid,NAME)VALUES(2,'董方卓');
--查詢
SELECT * FROM MEMBER;
--為avvice添加數據
INSERT INTO advice(adid,content,mid)VALUES(1,'應該提倡內部溝通機制,設置總裁郵箱',1);
INSERT INTO advice(adid,content,mid)VALUES(2,'為了公司內部良性發展,所有部門領導應該重新上崗',1);
INSERT INTO advice(adid,content,mid)VALUES(3,'要多開展員工培訓活動,讓員工更加有歸屬感',1);
INSERT INTO advice(adid,content,mid)VALUES(4,'應該開展多元化業務,更加滿足市場需求',2);
INSERT INTO advice(adid,content,mid)VALUES(5,'大力發展技術部門,為本公司設計自己的ERP系統,適應電子化信息發展要求',2);
COMMIT;
--查詢advice表
SELECT * FROM advice;
此時再在 advice中增加一條編號不在member中mid范圍內的數據
INSERT INTO advice(adid,content,mid) VALUES(6,'崗位職責透明化',99);

錯誤的信息就添加不進去了
刪除父表時要先刪除子表對應的數據
示例:刪除member中編號為1的數據
DELETE FROM MEMBER WHERE mid=1;
會報錯

不能刪除
需要刪除子表advice中mid=1的數據再刪除父表member中mid=1的數據 DELETE FROM advice WHERE mid=1; DELETE FROM MEMBER WHERE mid=1;
這時可以刪除
也可以在創建表時設置級聯
可以在創建表時設置級聯刪除 --在外鍵設置後面設置ON DELETE CASCADE
--先刪除
DROP TABLE advice PURGE; DROP TABLE MEMBER PURGE;
創建表成員
CREATE TABLE MEMBER (
mid NUMBER ,
NAME VARCHAR2(20) NOT NULL,
--創建主鍵約束
CONSTRAINT PK_mid PRIMARY KEY(mid)
);
--創建另一張表建議表
CREATE TABLE advice(
adid NUMBER,
content CLOB NOT NULL,
mid NUMBER,
CONSTRAINT PK_adid PRIMARY KEY(adid),
CONSTRAINT FK_mid FOREIGN KEY(mid) REFERENCES MEMBER(mid) ON DELETE CASCADE --主外鍵約束添加級聯刪除
);
這樣刪除父表中的記錄時,可以直接刪除
但查詢子表發現子表中的記錄也被刪除掉了
不想刪除子表中的記錄時可以用
在外鍵後加上ON DELETE SET NULL
--刪除表
DROP TABLE advice;
DROP TABLE MEMBER;
--創建表
CREATE TABLE MEMBER(
mid NUMBER,
NAME VARCHAR2(30) NOT NULL,
CONSTRAINT PK_mid PRIMARY KEY(mid)
);
CREATE TABLE advice(
adid NUMBER,
CONTENT CLOB NOT NULL,
mid NUMBER,
CONSTRAINT PK_adid PRIMARY KEY(adid),
CONSTRAINT FK_mid FOREIGN KEY(mid) REFERENCES MEMBER(mid) ON DELETE SET NULL --設置刪除時子表記錄相關的列為NULL
);
這樣刪除父表中的記錄時,可以直接刪除
但查詢子表發現子表中的記錄沒有刪除掉,只是相關的字段為NULL
強制刪除表
DROP FROM MEMBER WHERE mid=1 CASCADE CONSTRAINT;
父表會直接刪除,子表內容仍然存在
查看約束
SELECT constraint_name,constraint_type,table_name FROM user_constraints; --查看EMP表的約束 SELECT constraint_name,constraint_type,table_name FROM user_constraints WHERE table_name='EMP'
查看user_cons_columns數據字典 select * from user_cons_columns;
修改約束
增加約束語法
ALTER TABLE 表名稱
ADD CONSTRAINT 約束名稱 約束類型(約束字段)
刪除表
DROP TABLE advice;
DROP TABLE MEMBER;
--創建表
CREATE TABLE MEMBER(
mid NUMBER,
NAME VARCHAR2(30)
);
CREATE TABLE advice(
adid NUMBER,
CONTENT CLOB ,
mid NUMBER
);
--為member表的mid字段增加主鍵約束
ALTER TABLE MEMBER
ADD CONSTRAINT PK_mid PRIMARY KEY(mid);
--為member age字段增加檢查約束
--先增加age字段
ALTER TABLE MEMBER
ADD(age NUMBER);
SELECT * FROM MEMBER;
ALTER TABLE MEMBER
ADD CONSTRAINT ck_age CHECK(age BETWEEN 0 AND 200);
--檢查member表中的字段
SELECT constraint_name,constraint_type,table_name
FROM User_Constraints WHERE table_name='MEMBER';
--為name字段設置非空
ALTER TABLE MEMBER
MODIFY(NAME NOT NULL);
啟用和禁用約束
啟用和禁用約束
ALTER TABLE 表名稱 ENABLE |DISABLE CONSTRAINT 約束名稱 [CASCADE]
--cascade關閉存在完整性關系的約束(主要是外鍵)
--禁用advcie中的Pk-adid主鍵約束 ALTER TABLE advice DISABLE CONSTRAINT pk_adid; --禁用memeber表中的pk_mid主鍵約束 ALTER TABLE MEMBER DISABLE CONSTRAINT pk_mid; --啟用約束 ALTER TABLE 表名稱 ENABLE CONSTRAINT 約束名稱 --啟用memeber表中的pk_mid主鍵約束 ALTER TABLE MEMBER ENABLE CONSTRAINT pk_mid --刪除約束 ALTER TABLE 表名稱 DROP CONSTRAINT 約束名[CASCADE] --刪除advcie中的pk_adid約束-無關外鍵 ALTER TABLE advice DROP CONSTRAINT pk_adid; --刪除member中的pk_mid-有關外鍵 ALTER TABLE MEMBER DROP CONSTRAINT pk_mid CASCADE;