约束简介:
一、表级约束和列级约束:
1、NOT NULL约束:
NOT NULL约束(constraint):
create table emp2(
id number(10) constraint emp2_id_nn not null,
name varchar2(20) not null,
salary number(10,2)
)
2、UNIQUE约束(适用于表级或列级):
(1)、UNIQUE约束(适用于表级或列级):
create table emp30(
--列级约束
id number(10) constraint emp3_id_uk unique,
name varchar2(20) constraint emp3_name_nn null,
email varchar2(20),
salary number(10,2) ,
--表级约束
constraint emp3_email_uk unique(email)
)
二、主键:
通过主键可以唯一的定义一个数据表中的一条数据。
主键也区分列级和表级。
1、列级约束定义主键:
create table empl04(
--列级约束
id number(10) constraint empl04_id_pk primary key,
name varchar2(20) constraint empl04_name_nn null,
email varchar2(20),
salary number(10,2),
--表级约束
constraint empl04_email_uk unique(email)
)
(2)、错误:因为主键一定非空。
SQL> insert into empl04
2 values(null,'AA',null,2000);
insert into empl04
values(null,'AA',null,2000)
ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMPL04"."ID")
正确方式:
insert into empl04
values(1001,'AA',null,2000)
(3)、主键违反唯一约束条件:
insert into empl04
values(1001,'CC',null,2000)
ORA-00001: 违反唯一约束条件 (SCOTT.EMPL04_ID_PK)
(4)、如果定义一个为主键了,不能将主键对应的属性的值赋为空值或者已经存在的值。
2、表级约束定义主键:
(1)、错误(不允许约束条件说明)
create table empl05(
--列级约束
--id number(10) constraint empl05_id_pk primary key,
id number(10) constraint empl05_id_pk,
name varchar2(20) constraint empl04_name_nn null,
email varchar2(20),
salary number(10,2),
--表级约束
constraint empl05_email_uk unique(email),
constraint empl05_id_pk primary key(id)
)
ORA-02253: 此处不允许约束条件说明
订正:
create table empl05(
--列级约束
--id number(10) constraint empl05_id_pk primary key,
id number(10), //后边的约束条件去掉了。
name varchar2(20) constraint empl04_name_nn null,
email varchar2(20),
salary number(10,2),
--表级约束
constraint empl05_email_uk unique(email),
constraint empl05_id_pk primary key(id)
)
三、外键与约束:
1、外键用于连接
create table empl06(
--列级约束
--id number(10) constraint empl06_id_pk primary key,
id number(10),
name varchar2(20) constraint empl06_name_nn null,
email varchar2(20),
salary number(10,2),
department_id number(10),
--表级约束
constraint empl06_email_uk unique(email),
constraint empl06_id_pk primary key(id),
constraint empl06_dept_id_fk foreign key(department_id)
约束 约束的名 功能 作用在department_id
references departments(department_id)
与departments表中的department_id做连接。
)
2、已经存在1001号id,因为id是主键,所以不允许重复。
insert into empl06
values(1001,'AA',null,2000,2000)
ORA-00001: 违反唯一约束条件 (SCOTT.EMPL06_ID_PK)
3、未找到父类关键字:在departments表中没有此列。
insert into empl06
values(1002,'AA',null,2000,2000)
ORA-02291: 违反完整约束条件 (SCOTT.EMPL06_DEPT_ID_FK) - 未找到父项关键字
4、级联删除、级联置空:
在最后书写级联删除或级联置空语句。
(1)、级联置空的书写:
create table empl07(
--列级约束
--id number(10) constraint empl07_id_pk primary key,
id number(10),
name varchar2(20) constraint empl07_name_nn null,
email varchar2(20),
salary number(10,2),
department_id number(10),
--表级约束
constraint empl07_email_uk unique(email),
constraint empl07_id_pk primary key(id),
constraint empl07_dept_id_fk foreign key(department_id) references departments(department_id) on delete set null
)
5、CHECK约束:
(1)、
create table empl08(
--列级约束
--id number(10) constraint empl08_id_pk primary key,
id number(10),
name varchar2(20) constraint empl08_name_nn null,
email varchar2(20),
--加check约束最低生活保障工资不得低于1500,工资不高于30000;
salary number(10,2) check(salary>1500 and salary<30000),
department_id number(10),
--表级约束
constraint empl08_email_uk unique(email),
constraint empl08_id_pk primary key(id),
constraint empl08_dept_id_fk foreign key(department_id) references departments(department_id) on delete set null
)
(2)、插入操作:
insert into empl08
values(1001,'AA','AA126@.com',500,30)
salary必须约束在1500-30000之间
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C0011452)
四、添加约束:
1、添加或删除约束:
(1)、修改约束:
alter table empl05
modify(salary number(10,2) not null)
(2)、删除约束:
alter table empl05
drop constraint empl05_name_nn
(3)、添加约束:
alter table empl05
add constraint empl05_name_uk unique(name)
2、无效化约束与解除无效化约束:
(1)、无效化约束:
alter table empl06
disable constraint empl06_email_uk
(2)、使失效的约束有效:
如果属性值存在重复的,解封失效约束的语句会出现有错
为了使解封失效约束的语句可以执行,必须先把重复的属性值删除掉。
alter table empl06
enable constraint empl06_email_uk
3、查询约束:
4、查询定义约束的列:
五、测验题一:
57. 定义非空约束
1). 非空约束只能定义在列级.
2). 不指定约束名
create table emp2 (
name varchar2(30) not null,
age number(3)
);
3). 指定约束名
create table emp3(
name varchar2(30) constraint name_not_null not null,
age number(3));
58. 唯一约束
1). 列级定义
①. 不指定约束名
create table emp2 (
name varchar2(30) unique,
age number(3)
);
②. 指定约束名
create table emp3 (
name varchar2(30) constraint name_uq unique,
age number(3)
);
2). 表级定义: 必须指定约束名
①. 指定约束名
create table emp3 (
name varchar2(30),
age number(3),
constraint name_uq unique(name)
);
58.1 主键约束:唯一确定一行记录。表明此属性:非空,唯一
59. 外键约束
1). 列级定义
①. 不指定约束名
create table emp2(
emp_id number(6),
name varchar2(25),
dept_id number(4) references dept2(dept_id))
②. 指定约束名
create table emp3(
emp_id number(6),
name varchar2(25),
dept_id number(4) constraint dept_fk3 references dept2(dept_id))
2). 表级定义: 必须指定约束名
①. 指定约束名
create table emp4(
emp_id number(6),
name varchar2(25),
dept_id number(4),
constraint dept_fk2 foreign key(dept_id) references dept2(dept_id))
60. 约束需要注意的地方
1). ** 非空约束(not null)只能定义在列级
2). ** 唯一约束(unique)的列值可以为空
3). ** 外键(foreign key)引用的列起码要有一个唯一约束
61. 建立外键约束时的级联删除问题:
1). 级联删除:
create table emp2(
id number(3) primary key,
name varchar2(25) unique,
dept_id number(3) references dept2(dept_id) on delete cascade)
2). 级联置空
create table emp3(
id number(3) primary key,
name varchar2(25) unique,
dept_id number(3) references dept2(dept_id) on delete set null)
六、测验题二:
1、向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)
ALTER table emp2
ADD constraint my_emp_id_pk primary key(id);
为约束起别名(constraint 别名) 将约束作用在id属性中
2、向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)
ALTER table dept2
ADD constraint my_dept_id_pk primary key(id)
3、向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
ALTER table emp2
ADD (dept_id number(10) constraint emp2_dept_id_fk references dept2(id));
添加约束 为约束起别名 与dept2中的表相关联
准备工作:
create table emp2 as select employee_id id, last_name name, salary from employees
create table dept2 as select department_id id, department_name dept_name from departments