oracle进阶之约束
六种约束及列级表级约束
常见约束:
-
检查约束(check)name>4
-
唯一约束(Unique)id:1,2,3…
-
主键约束(Primary key)类似唯一约束 非空并且唯一
-
外键约束(Foreign key)两张表 学生表 -------课程表(1,2,3)
-
非空约束(Not null)值不能为NULL
-
默认约束(Default)默认给个值
主键约束和唯一的区别:
-
主键不能为NULL唯一可以(核心区别)
-
主键可以是复合主键,也可以是单值主键(id)
-
一张表只能由一个主键或者复合主键(只能设置一次),但唯一键可以设置多次
约束分类:
列级约束 | 表级约束 |
---|---|
作用于一个列 | 作用于一个列/多列 |
列的后面 | 表的后面 |
可以有多个约束(空格分隔) | 逗号分隔 |
全部有六个 | 4个(主键 外键 唯一 检查) |
创建表
create table student
(
stuno number(3) primary key,--主键非空且唯一
stuname varchar2(10) not null unique,
stuaddress varchar2(20) default 'CHINE' check(length(stuaddress)>2),
stubid number(3)
);
insert into student values(1,'zs','石嘴山',1);--插入一条数据举例约束
检查约束
检查约束(check):限制长度name >4
insert into student values(5,'ww','北京',5);--测试检查约束 (地址长度等于2)
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C0011129)
唯一约束
唯一约束(unique):id :1,2,3,4有且只有一个 可以为null
insert into student values(3,'zs','石嘴山',3);--测试唯一约束 (姓名为zs)
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011131)
--分析:zs已经存在再添加违反唯一约束
主键约束
主键约束(primary key):和唯一很像 主键不能为null(核心区别)
主键唯一不为空
insert into student values(null,'zs','石嘴山',1);--测试主键非空 (主键为null)
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."STUDENT"."STUNO")
insert into student values(1,'ls','石嘴山',2);--测试主键唯一 (主键插入重复1)
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011130)
--报错:违反唯一约束条件
--1.可能是主键报错
--2.也可能是唯一约束报错
外键约束
外键约束(foreign key):其他约束都是单张表,外键约束是多张表,(一张表知道另一张表的的情况)
非空约束
非空约束(not null):不能为空 不能为null
insert into student values(4,null,'石嘴山',4);--测试非空约束 (名字为null)
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."STUDENT"."STUNAME")
注意事项
- 报错:违反唯一约束条件 可能主键报错 也可能唯一约束报错
- 如果有多个约束,default必须放在第一位(强制要求)
- check约束:如何编写:和使用where一致
select * from student where length(stuaddress)>2;
select * from student where stuname('zs','ls');
select * from student where stuno >2;
check(length(stuaddress)>2);
check(stuname('zs','ls'));
check(stuno>2);
4.唯一约束,可以是NULL,不建议是null
create table student
(
stuno number(3) primary key,
stuname varchar2(10) unique,
stuaddress varchar2(20) default 'CHINE' check(length(stuaddress)>2),
stubid number(3)
);
insert into student values(1,null,default,1);
insert into student values(2,null,default,2);
select * from student;
STUNO STUNAME STUADDRESS STUBID
---------- -------------------- ---------------------------------------- ----------
1 CHINE 1
2 CHINE 2
约束命名
约束命名规范
约束:约束类型_字段名
约束名称 | 约束规范 |
---|---|
主键约束 | PK_字段名 |
检查约束 | CK_字段名 |
唯一约束 | UQ_字段名 |
外键约束 | FK_子表-父表 |
非空约束 | NN_字段名 |
默认约束 | 一般不需要命名 |
--主键约束:PK_字段名
--检查约束:CK_字段名
--唯一约束:UQ_字段名
--外键约束:FK_子表-父表
--非空约束:NN_字段名
--默认约束:一般不需要命名
drop table student purge;
create table student
(
stuno number(3) constraint PK_stuno primary key,
stuname varchar2(10) constraint NN_stuname not null constraint UQ_stuname unique,
stuaddress varchar2(20) default 'CHINE' constraint CK_stuaddress check(length(stuaddress)>2),
stubid number(3)
);
insert into student values(1,'zs',default,1);
insert into student values(1,'zs',default,1);
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.PK_STUNO)
--列级约束在字段后面(空格),表级约束在表后面(逗号)
create table student2
(
stuno number(3),
stuname varchar2(10),
stuaddress varchar2(20),
stubid number(3),
constraint PK_sno primary key(stuno),--主键
constraint UQ_sname_subid unique(stuname,stubid),--唯一
constraint CK_saddress check(length(stuaddress)>2)--检查
);