完整约束三(学习笔记)
主外键约束FK
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;