06-约束
约束是表级的强制规定
有以下五种约束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名。
创建和修改约束:
建表的同时
建表之后
可以在表级或列级定义约束。
可以通过数据字典视图查看约束。
作用范围:
①列级约束只能作用在一个列上
②表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上)
定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
非空(not null) 约束只能定义在列上
约束起名:constraint 约束名(表名_列名_约束简写)
NOT NULL:非空;只能定义在列上;
unique:唯一的,可插入null值,空值之间不违反唯一约束;
表级约束:最后行,constraint 约束名 什么约束(作用哪列);
primary key :不能为空,且唯一;
foreign key: 外键;如:constraint 约束名 forekey key(哪列) references 表名(哪列);
check: 列的限制 ;
1 --NOT NULL 约束
2 CREATE TABLE employees(
3 employee_id NUMBER(6),
4 last_name VARCHAR2(25) NOT NULL, --系统命名
5 salary NUMBER(8,2),
6 commission_pct NUMBER(2,2),
7 hire_date DATE
8 CONSTRAINT emp_hire_date_nn --用户命名
9 NOT NULL);
10
11 --UNIQUE 约束
12 --唯一约束,允许出现多个空值:NULL。
13 CREATE TABLE employees(
14 employee_id NUMBER(6),
15 last_name VARCHAR2(25) UNIQUE,--系统命名
16 email VARCHAR2(25),
17 salary NUMBER(8,2),
18 commission_pct NUMBER(2,2),
19 hire_date DATE NOT NULL,
20 CONSTRAINT emp_email_uk UNIQUE(email) --用户命名
21 );
22
23 --FOREIGN KEY 约束
24 --FOREIGN KEY: 在表级指定子表中的列
25 --REFERENCES: 标示在父表中的列
26 --ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
27 --ON DELETE SET NULL(级联置空): 子表中相应的列置空
28 CREATE TABLE employees(
29 employee_id NUMBER(6),
30 last_name VARCHAR2(25) NOT NULL,
31 email VARCHAR2(25),
32 salary NUMBER(8,2),
33 commission_pct NUMBER(2,2),
34 hire_date DATE NOT NULL,
35 department_id NUMBER(4),
36 CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
37 REFERENCES departments(department_id) ON DELETE CASCADE,
38 CONSTRAINT emp_email_uk UNIQUE(email));
39
40 --CHECK 约束
41 --定义每一行必须满足的条件
42 CREATE TABLE employees(
43 employee_id NUMBER(6),
44 last_name VARCHAR2(25) NOT NULL, --系统命名
45 salary NUMBER(8,2) check(salary > 0 and salary < 1000000)
46 );
47
48 --添加约束的语法
49 --使用 ALTER TABLE 语句:
50 --添加或删除约束,但是不能修改约束
51 --有效化或无效化约束
52 --添加 NOT NULL 约束要使用 MODIFY 语句
53 ALTER TABLE employees
54 ADD CONSTRAINT emp_manager_fk
55 FOREIGN KEY(manager_id)
56 REFERENCES employees(employee_id);
57
58 --删除约束
59 ALTER TABLE employees
60 DROP CONSTRAINT emp_manager_fk;
61
62 --无效化约束
63 ALTER TABLE employees
64 DISABLE CONSTRAINT emp_emp_id_pk;
65
66 --激活约束
67 --当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引
68 ALTER TABLE employees
69 ENABLE CONSTRAINT emp_emp_id_pk;
70
71 --查询约束
72 --查询数据字典视图 USER_CONSTRAINTS
73 SELECT constraint_name, constraint_type,
74 search_condition
75 FROM user_constraints
76 WHERE table_name = 'EMPLOYEES';
77
78 --查询定义约束的列
79 --查询数据字典视图 USER_CONS_COLUMNS
80 SELECT constraint_name, column_name
81 FROM user_cons_columns
82 WHERE table_name = 'EMPLOYEES';
eg:
1 --准备工作:
2 create table emp2 as select employee_id id, last_name name, salary from employees;
3 create table dept2 as select department_id id, department_name dept_name from departments;
4
5 --向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)
6 ALTER table emp2
7 ADD constraint my_emp_id_pk primary key(id);
8
9 --向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)
10 ALTER table dept2
11 ADD constraint my_dept_id_pk primary key(id);
12
13 --向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
14 ALTER table emp2
15 ADD (dept_id number(10) constraint emp2_dept_id_fk references dept2(id));