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));

 

posted @ 2020-08-03 20:47  路修索  阅读(154)  评论(0编辑  收藏  举报