Oracle中的约束

---------------------------------------------------Oracle中的约束------------------------------------------

在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。

1.主键约束

主键约束都是在id上使用,而且本身已经默认了内容不能为空,可以在建表的时候指定。

创建一张表,把pid作为主键

createtable person(

       pid      number(10) primarykey,

       name    varchar2(10),

       gender   number(1default1,

       birthday date

);

主键不可重复,SCOTT.SYS_C0017981是系统自动分配的约束的名字

主键不可为空

我们可以自己来指定主键约束的名字

create table person(

       pid      number(10),

       name    varchar2(10),

       gender   number(1default1,

       birthday date,

       constraint person_pk_pid primarykey(pid)

);

2.非空约束

使用非空约束,可以使指定的字段不可以为空。

范例:建立一张pid和name不可以为空的表

create table person(

       pid      number(10) not null,

       name    varchar2(10) not null,

       gender   number(1)  ,

       birthday date,

);

3.唯一约束(unique)

表中的一个字段的内容是唯一的

范例:建表一个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)

);

 

代码示例:

--主键约束

create table person(

       person_id number(4) primary key,--主键是唯一的,不可以为null的

       pname     varchar2(10),

       age       number(3),

       birthday  date

);

 

insert into person

  (person_id, pname, age, birthday)

values

  (1000, '张三', 20, to_date('1985-04-22', 'yyyy-mm-dd'));

 

drop table person;

 

--自定义主键名称,constraint + 自定义主键名 + primary key(列名)

create table person(

       person_id number(4),

       pname     varchar2(10),

       age       number(3),

       birthday  date,

       constraint person_person_id_pk primary key(person_id)--自定义主键名称

);

 

--非空约束,定义了非空约束的列表值就不能为空

create table person(

       person_id number(4),

       pname     varchar2(10) not null,--定义非空约束

       age       number(3),

       birthday  date,

       constraint person_person_id_pk primary key(person_id)

);

 

--唯一约束

create table person(

       person_id number(4),

       pname     varchar2(10) unique,--定义为唯一约束,一张表可以有多个唯一约束,但是值不能重复,可以有多个null

       age       number(3),

       birthday  date

);

 

insert into person

  (person_id, pname, age, birthday)

values

  (1000,null, 20, to_date('1985-04-22', 'yyyy-mm-dd'));

 

--自定义唯一约束名

create table person(

       person_id number(4),

       pname     varchar2(10),--定义为唯一约束,一张表可以有多个唯一约束,但是值不能重复,可以有多个null

       age       number(3),

       birthday  date,

       constraint person_pname_uk unique(pname)--自定义唯一约束名

);

 

select * from person;


4.检查约束

使用检查约束可以来约束字段值的合法范围。

范例:创建一张表性别只能是1或2

create table person(

       pid      number(10) ,

       name    varchar2(10),

       gender   number(1check(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 primarykey(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 primarykey(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 primarykey(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 primarykey(detail_id),

      constraint order_detail_order_id_fk foreignkey(order_id) references orders(order_id)

);

 

外键关联一定注意:

外键一定是主表的主键

删表时一定先删字表再删主表,如果直接删主表会出现由于约束存在无法删除的问题

但是可以强制删除drop table orders cascade constraint;(不建议)

删除主表的数据可以删除子表的关联数据,再删主表,也可以使用级联删除级联删除在外键约束上要加上on delete cascade

constraint order_detail_order_id_fk foreignkey(order_id)

      references orders(order_id) ondeletecascade

这样删除主表数据的时候会把字表的关联数据一同删除

唯一约束和主键约束的区别:

简单说:

主键不能为空

而唯一可以为空

相同的就是  都不允许重复

 

详细的说:

1.主键约束(PRIMARY KEY

主键用于唯一地标识表中的每一条记录,一张表只能有一个主键约束。

是不可能(或很难)更新. 

主键列上没有任何两行具有相同值(即重复值),不允许空(NULL).

主健可作外健,唯一索引不可;

 

2. 唯一性约束(UNIQUE

唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束.

只要唯一就可以更新. 

即表中任意两行在  指定列上都不允许有相同的值,允许空(NULL).

一个表上可以放置多个唯一性约束

 检查约束和外键约束代码示例:

--检查约束

drop table person;

create table person(

       person_id number(4),

       pname     varchar2(10),

       gender    number(1) check (gender in(1 , 2)),--定义检查约束

       age       number(3),

       birthday  date

);

 

insert into person

  (person_id, pname, age, birthday,gender)

values

  (1000,'张三', 20, to_date('1985-04-22', 'yyyy-mm-dd'),2);

 

--自定义检查约束的名字

--检查约束

drop table person;

create table person(

       person_id number(4),

       pname     varchar2(10),

       gender    number(1),

       age       number(3),

       birthday  date,

       constraint person_gender_ck check (gender in(1 , 2))

);

 

--外键约束

drop table orders;

create table orders(

       order_id       number(4),

       total_price    number(7,2),

       order_time     date,

       constraint orders_order_id_pk primary key(order_id)

);

 

drop table order_detail;

create table order_detail(

       detail_id      number(4),

       item_name      varchar2(10),

       price          number(7,2),

       quantity       number(4),

       order_id       number(4),

       constraint order_detail_id_pk primary key(detail_id),

       constraint order_detail_oder_id_fk foreign key(order_id) references orders(order_id)--定义外键约束

);

 

insert into orders values(1000, 10000, sysdate);

 

insert into order_detail values(1000, 'iphone', 5000, 2, 1000);--子表插入时有外键约束

 

select * from orders;

 

select * from order_detail;

 

delete from roders;--主表删除数据时有外键约束,如果想要删除需要先删除子表的数据再删除主表

 

drop table orders;--主表删除时受外键约束,需要先删除子表再删除主表

 

drop table orders cascade constraint;--强制删除主表,不建议这样删除

 

--级联删除

drop table orders;

create table orders(

       order_id       number(4),

       total_price    number(7,2),

       order_time     date,

       constraint orders_order_id_pk primary key(order_id)

);

 

drop table order_detail;

create table order_detail(

       detail_id      number(4),

       item_name      varchar2(10),

       price          number(7,2),

       quantity       number(4),

       order_id       number(4),

       constraint order_detail_id_pk primary key(detail_id),

       constraint order_detail_oder_id_fk foreign key(order_id)

       references orders(order_id) on delete cascade --级联删除设置

);

 

delete from orders; --级联删除

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值