约束
约束是表级的强制规定
约束放置在表中删除有关联关系的数据
有以下五种约束:
NOT NULL 非空
UNIQUE 唯一
PRIMARY KEY 主键(非空且唯一)
FOREIGN KEY 外键(依赖于主键)
CHECK 检查
CREATE TABLE EMPLOYEES(
EMPLOYEE_ID NUMBER(6),
LAST_NAME VARCHAR2(25) NOT NULL,
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
HIRE_DATE DATE
CONSTRAINT EMP_HIRE_DATE_NN
NOT NULL);
CREATE TABLE T6
(
X NUMBER UNIQUE,--列级约束
Y NUMBER,
Z NUMBER,
CONSTRAINT CON_Y UNIQUE(Y));--表级约束
创建一个表T7
列名分别是a,b,c,d,e,f
类型分别是number,varchar(2),date,number,number,number
其中a 非空(列级约束),b列唯一(表级约束),c列默认值是当前系统时间
向表中插入2行记录,
1,’hehe’,default,2,3,4
2,’haha’,default,5,6,7
修改表,将第一行的4改成8
CREATE TABLE T7
(
a NUMBER NOT NULL,
b VARCHAR2(10),
c DATE DEFAULT SYSDATE,
d NUMBER,
e NUMBER,
f NUMBER,
CONSTRAINT b_col UNIQUE(b));
INSERT INTO T7 VALUES(1,'hehe',DEFAULT,2,3,4);
INSERT INTO T7 VALUES(2,'haha',DEFAULT,5,6,7);
UPDATE T7 SET f=8
WHERE f=4;
列级主键约束
CREATE TABLE T8 (
X NUMBER PRIMARY KEY,
Y NUMBER,
Z NUMBER);
表级主键约束
CREATE TABLE T9(
X NUMBER,
Y NUMBER,
Z NUMBER,
CONSTRAINT x_col PRIMARY KEY(X));
联合主键约束
CREATE TABLE T15
(
ID NUMBER(18),
PHONE_NUMBER NUMBER(11),
CONSTRAINT PK_001 PRIMARY KEY(ID,PHONE_NUMBER)
);
INSERT INTO T15 VALUES(110121,13500001111);
INSERT INTO T15 VALUES(110121,13500001110);
CREATE TABLE DEPT_I AS SELECT * FROM DEPT WHERE 1=2;要DEPT表的结构,不要它的数据
FOREIGN KEY 外键和主键的约束关系
CONSTRAINT 约束名称 FOREIGN KEY(外键所在的本表/子表的列)REFERENCES 父表(主键列)
FOREIGN KEY约束的关键字
ON DELETE CASCADE:当父表中的列被删除时,子表中相对应的列也被删除
ON DELETE SET NULL:当父表中的列被删除时,子表中相对应的列置空
CREATE TABLE DEPT_I AS SELECT * FROM DEPT;
CREATE TABLE EMP_I AS SELECT * FROM EMP;
ALTER TABLE DEPT_I ADD CONSTRAINT PK1 PRIMARY KEY(DEPTNO);
ALTER TABLE EMP_I ADD CONSTRAINT FK1 FOREIGN KEY(DEPTNO) REFERENCES DEPT_I(DEPTNO);
DELETE DEPT_I WHERE DEPTNO=10;这样删,显示违反约束条件
设置为允许级联删除
CREATE TABLE DEPT_II AS SELECT * FROM DEPT;
CREATE TABLE EMP_II AS SELECT * FROM EMP;
ALTER TABLE DEPT_II ADD CONSTRAINT PK2 PRIMARY KEY (DEPTNO);
ALTER TABLE EMP_II ADD CONSTRAINT FK2 FOREIGN KEY (DEPTNO) REFERENCES DEPT_II(DEPTNO) ON DELETE CASCADE;
DELETE DEPT_II WHERE DEPTNO=10;
将父表被删除的值在子表列值置空
CREATE TABLE DEPT_III AS SELECT * FROM DEPT;
CREATE TABLE EMP_III AS SELECT * FROM EMP;
ALTER TABLE DEPT_III ADD CONSTRAINT PK2 PRIMARY KEY (DEPTNO);
ALTER TABLE EMP_III ADD CONSTRAINT FK2 FOREIGN KEY (DEPTNO) REFERENCES DEPT_III(DEPTNO) ON DELETE SET NULL;
DELETE DEPT_III WHERE DEPTNO=10;
CHECK约束 定义每一行必须满足的条件
CREATE TABLE T12
(
X NUMBER,
Y NUMBER CONSTRAINT C_O1 CHECK(Y>100)
);
INSERT INTO T12 VALUES(1,1);
会报错
所有的DDL,都不需要对表进行提交
查看约束
SELECT CONSTRAINT_NAME,COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME='EMP_I'
禁用约束
ALTER TABLE EMP_I
DISABLE CONSTRAINT FK1 CASCADE;
启用约束
ALTER TABLE EMP_I
ENABLE CONSTRAINT FK1;
如果主键和外键在同一个表里,那子表里面的列的值必须要在父表里面存在才行
删除主键约束级联删除外键约束
ALTER TABLE T30 DROP CONSTRAINT PK1 CASCADE;
修改列的属性
ALTER TABLE T30 MODIFY(K DATE DEFAULT SYSDATE);
ALTER TABLE EMP2
DROP COLUMN EMPLOYEE_ID;--删除列
ALTER TABLE EMP2
DROP COLUMN EMPLOYEE_ID CASCADE CONSTRAINT;--同时删除约束
ALTER TABLE EMP2
DROP (EMPLOYEE_ID) CASCADE CONSTRAINT
ALTER TABLE EMP2
DROP (EMPLOYEE_ID,DEPARTMENT_ID,JOB_ID) CASCADE CONSTRAINT
重命名列
ALTER TABLE T22 RENAME COLUMN Z TO ID;
重命名约束
ALTER TABLE T22 RENAME CONSTRAINT SYS_C0011412 TO PK2222;
CREATE TABLE T22 (X NUMBER PRIMARY KEY,Y NUMBER,Z NUMBER,CHECK(Y>50),CHECK(Z>50));
SELECT CONSTRAINT_NAME,COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME='T22';
ALTER TABLE T22 DROP (X,Y) CASCADE CONSTRAINT;
ALTER TABLE T22 RENAME COLUMN Z TO PKZ;
ALTER TABLE T22 RENAME CONSTRAINT SYS_C0011412 TO PK2222;
CREATE TABLE T25
(
C1 NUMBER,
C2 NUMBER,
C3 NUMBER CONSTRAINT CON_3 NOT NULL,
C4 NUMBER,
C5 NUMBER CONSTRAINT CON_5 CHECK(C5>900),
C6 NUMBER CONSTRAINT CON_6 UNIQUE,
CONSTRAINT CON_1 PRIMARY KEY(C1,C2),
CONSTRAINT CON_4 FOREIGN KEY(C4,C5) REFERENCES T25(C1,C2)
);
ALTER TABLE T25 ADD C7 NUMBER;
ALTER TABLE T25 ADD C7 NUMBER;
desc t25;
ALTER TABLE T25 DROP COLUMN C3 CASCADE CONSTRAINT;删除列同时删除约束
ALTER TABLE T25 DISABLE CONSTRAINT CON_1 CASCADE;----启用约束
ALTER TABLE T25 ENABLE CONSTRAINT CON_1 CASCADE;----禁用约束
ALTER TABLE T25 DROP CONSTRAINT CON_6;----删除约束