约束
在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。
1
主键约束(掌握)
主键约束都是在id上使用,而且本身已经默认了内容不能为空,可以在建表的时候指定。
创建一张表,把pid作为主键
create table person(
pid number(10) primary key,
name varchar2(10),
gender number(1) default 1,
birthday date
);
主键不可重复, SCOTT.SYS_C0017981是系统自动分配的约束的名字
主键不可为空
我们可以自己来指定主键约束的名字
create table person(
pid number(10),
name varchar2(10),
gender number(1) default 1,
birthday date,
constraint person_pk_pid primary key(pid)
);
2
非空约束
使用非空约束,可以使指定的字段不可以为空。
范例:建立一张pid和name不可以为空的表
create table person(
pid number(10) not null,
name varchar2(10) not null,
gender number(1) ,
birthday date,
);
3
唯一约束
表中的一个字段的内容是唯一的
范例:建表一个name是唯一的表
create table person(
pid number(10) ,
name varchar2(10) unique,
gender number(1) ,
birthday date
);
唯一约束的名字也可以自定义
create table person(
pid number(10) ,
name varchar2(10),
gender number(1) ,
birthday date,
constraint person_name_uk unique(name)
);
4
检查约束
使用检查约束可以来约束字段值的合法范围。
范例:创建一张表性别只能是1或2
create table person(
pid number(10) ,
name varchar2(10),
gender number(1) check(gender in (1, 2)),
birthday date
);
检查约束也可以自定义
create table person(
pid number(10) ,
name varchar2(10),
gender number(1),
birthday date,
constraint person_gender_ck check(gender in (1,2))
);
5
外键约束(掌握)
之前所讲的都是单表的约束,外键是两张表的约束,可以保证关联数据的完整性。
范例:创建两张表,一张订单表,一张是订单明细表,订单和明细是一对多的关系
订单表:
create table orders( order_id number(10) , total_price number(10,2), order_time date, constraint orders_order_id_pk primary key(order_id)); |
---|
订单详情表:
create table order_detail( detail_id number(10) , order_id number(10), item_name varchar2(10), quantity number(10), constraint order_detail_detail_id_pk primary key(detail_id)); |
---|
测试数据:
insert into orders values(1, 200, to_date('2015-12-12','yyyy-MM-dd'));insert into order_detail values(1, 2, 'java',1); |
---|
我们在两张表中插入如上两条数据,我们发现在order_detail表中插入的order_id在order表中并不存在,这样在数据库中就产生了脏数据。此时需要外键来约束它。
我们再次建表
create table orders( order_id number(10) , total_price number(10,2), order_time date, constraint orders_order_id_pk primary key(order_id)); |
---|
create table order_detail( detail_id number(10) , order_id number(10), item_name varchar2(10), quantity number(10), constraint order_detail_detail_id_pk primary key(detail_id), constraint order_detail_order_id_fk foreign key(order_id) references orders(order_id)); |
---|
外键关联一定注意:
外键一定是主表的主键
删表时一定先删子表再删主表,如果直接删主表会出现由于约束存在无法删除的问题
但是可以强制删除drop table orders cascade constraint;(不建议)
删除主表的数据可以先删除子表的关联数据,再删主表,也可以使用级联删除。
级联删除在外键约束上要加上on delete cascade 如
constraint order_detail_order_id_fk foreign key(order_id)
references orders(order_id) on delete cascade
这样删除主表数据的时候会把子表的关联数据一同删除
Scott用户下的表结构
6
Scott用户下的表结构