玩转oracle之进阶约束

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

注意事项

  1. 报错:违反唯一约束条件 可能主键报错 也可能唯一约束报错
  2. 如果有多个约束,default必须放在第一位(强制要求)
  3. 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)--检查
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值