Oracle学习笔记003(约束)

在这里插入图片描述

约束

  • 约束是表级的强制规定,而根据约束的作用域不同,约束又可以分为表级约束和列级约束两种.通俗易懂的说就是列级约束就是定义一列时所添加的约束,定义在约束列的后边,只能作用在当前列上;而表级约束就是不单单只能作用于某一个列上,二是可以同时作用在多个列上,单独定义。

  • Oracle中使用关键字CONSTRAINTCONSTRAINT定义约束.

  • Oracle中的6种约束

     1. PRIMARY KEY                        主键约束(唯一性、非空性)
     2. UNIQOE                             唯一性约束
     3. NOT NULL                           非空约束(只能定义在列上)
     4. FOREIGN KEY                        外键约束(两个表之间建立关系)
     5. DEFAULT                            默认约束(数据的默认值)
     6. CHECK                              检查约束(对数据的格式、范围、长度等等的限制)
    

1. 建表的时候添加约束

--给表添加约束条件之后创建表
create table pleatuser(
    id varchar2(32),
    --列级非空约束
    user_name varchar2(32) not null,
    --默认约束
    user_addr varchar2(64) default '该用户很懒,没有填写地址',
    --唯一约束
    phone varchar2(11) unique,
    --设置主键
    constraint pleatuser_id_pk primary key(id)
    )tablespace users;

--插入语句报错   ORA-01400: 无法将 NULL 插入 ("ORACLEUSER"."PLEATUSER"."USER_NAME")
insert into pleatuser(id,user_name,phone) values('001',null,'123123456');

--满足非空约束  正确
insert into pleatuser(id,user_name,phone) values('001','Tom001','123123456');

--插入语句报错   ORA-00001: 违反唯一约束条件 (ORACLEUSER.SYS_C006999)
insert into pleatuser(id,user_name,phone) values('002','Tom002','123123123');

--满足唯一约束   正确 
insert into pleatuser (id,user_name,phone) values('002','Tom002','123123123');

--查询结果如下,地址没有填写是默认值

在这里插入图片描述
在这里插入图片描述
检查约束(CHECK)

create table demo(
    id varchar2(8),
    name varchar2(32),
    --检查约束,性别只能填写 'w' 'm'
    sex varchar(32) default 'w'check(sex in ('w','m'))
    ) tablespace users;

--插入语句报错   ORA-02290: 违反检查约束条件 (ORACLEUSER.SYS_C007000)
insert into demo values ('001','python','男');

--满足检查约束  正确
insert into demo values ('001','python','m');

在这里插入图片描述
外键约束(foreign key)

--用户表
create table pleatuser(
    id varchar2(32),
    --列级非空约束
    user_name varchar2(32) not null,
    --默认约束
    user_addr varchar2(64) default '该用户很懒,没有填写地址',
    --唯一约束
    phone varchar2(11) unique,
    --设置主键
    constraint pleatuser_id_pk primary key(id)
    )tablespace users;

--订单表
create table indent(
    id varchar2(32),
    user_id varchar2(32) unique not null,
    commodity_id varchar2(32) unique not null,
    create_date date,
    --设置外面约束
    constraint pleatuser_indent_user_id foreign key(user_id) references pleatuser(id)
    ) tablespace users;


--插入数据测试约束条件
insert into pleatuser(id,user_name,phone) values('001','Tom1','123123456');

--插入数据违法外键约束 ORA-02291: 违反完整约束条件 (ORACLEUSER.PLEATUSER_INDENT_USER_ID) - 未找到父项关键字
insert into indent(id,user_id,commodity_id,create_date) values('0001','01','01',to_date('2020-02-19','yyyy-mm-dd'));

--满足外键,插入完成
insert into indent(id,user_id,commodity_id,create_date) values('0001','001','01',to_date('2020-02-19','yyyy-mm-dd'));

--查询结果
select * from pleatuser,indent;

在这里插入图片描述

2. 表建立完成之后添加约束条件

--为已经建立完成的表添加主键约束
alter table pleatuser add constraint pleatuser_id_pk primary key(id);

--适用于为已经建立好的表添加外键约束
alter table indent add constraint  pleatuser_indent_user_id foreign ley(user_id) references pleatuser(id);

--添加非空约束
alter table pleatuser modify user_name not null;

--添加唯一约束
alter table pleatuser add constraint uq_pleatuser_user_name unique(user_name);

3. 级联操作

--使用该方式,删除的时候,级联删除掉子表中的所有匹配行,创建外键时,通过 on delete cascade 子句指定该外键列可级联删除

alter table ident add constraint pleatuser_indent_user_id foreign key(user_id) references pleatuser (id) on delete cascade;


--使用该方式,删除的时候,会将对应子表中的所有匹配行的外键约束列置为NULL,通过 on delete set null 子句实现

alter table ident add constraint pleatuser_indent_user_id foreign key(user_id) references pleatuser (id) on delete set null;


边学习边记录,若有不足之处欢迎留言指点…

发布了63 篇原创文章 · 获赞 1 · 访问量 2034

猜你喜欢

转载自blog.csdn.net/qq_45061361/article/details/104393368