[code]
约束分为以下5种:
主键 ---唯一(表中只有一个主键),非空,不重复
唯一约束
检查约束: 检查一个列的内容是否合法
|---例如:年龄:0~150岁
非空约束
外键约束: 在两张表中进行约束的操作
create table person(
pid varchar2(10) primary key
)
Oracle错误信息:
ORA-0001:违反唯一性约束条件(SCOTT.SYS_C005270)
错误信息上给出的是一个编号的形式,实际上此编号就是表示约束的名称,是系统分配的名称
如果我们想自己去定义这个名称呢?
使用constraint
create table person(
pid varchar2(10),
constraint person_pid_pk primary key(pid)
)
Oracle错误信息:
ORA-0001:违反唯一性约束条件(SCOTT.person_pid_pk)
create table person(
pid varchar2(10),
name varchar2(20) not null, //因为非空约束在数据库的错误信息会明确指出来,所以也就没必要用constraint重命名了
constraint person_pid_pk primary key(pid)
)
唯一约束也是可以重命名
create table person(
pid varchar2(10),
name varchar2(20) unique not null,
constraint person_pid_pk primary key(pid)
)
create table person(
pid varchar2(10),
name varchar2(20) not null,
constraint person_pid_pk primary key(pid),
constraint person_name_uk unique(name)
)
检查约束: check
create table person(
pid varchar2(10),
name varchar2(20) not null,
age number(3) not null check(age between 0 and 150),
sex varchar2(2) default '男' check(sex in ('男','女','中')),
constraint person_pid_pk primary key(pid),
constraint person_name_uk unique(name)
)
因为错误信息也是自动的一个名字,所以我们可以重命名
create table person(
pid varchar2(10),
name varchar2(20) not null,
age number(3) not null ,
sex varchar2(2) default '男' ,
constraint person_pid_pk primary key(pid),
constraint person_name_uk unique(name),
constraint person_age_ck check(age between 1 and 150),
constraint person_sex_ck check(sex in ('男','女','中'))
)
主外键约束(foreign key)---正对两张表的约束
如果在一张表中有外键,那么插入这张表的数据时,这个外键必须存在,如果外键没有
则不能插入,会报错说:找不到父项关键字
create table book(
bid number primary key,
bname varchar2(5) not null,
pid varchar(18),
constraint person_book_pid_fk foreign key(pid) references person(pid) //想成挂载到person表的pid上,作为一个叶子节点
)
删除时候,先删除子表再删除父表。。。
如果我想不管外键直接删除怎么办。。。
添加的时候如果没有父亲,当然无法挂载啦
drop table person cascade constraints; //级联的翻译不好,翻译成忽略约束吧
如果希望一个表中的数据在删除时,可以自动删除掉其对应子表记录,则就可以使用级联删除操作,需要在定义表时候做出来
create table book(
bid number primary key,
bname varchar2(5) not null,
pid varchar(18),
constraint person_book_pid_fk foreign key(pid) references person(pid) on delete cascade//当删除父亲的时候,对应的孩子也会被删除
)
修改约束:(了解)
此时,需要为表中添加若干个约束,添加约束的语法如下:
alter table 表名称 add constraint 约束名称 约束类型(约束字段)
删除约束:
alter table book drop constraint book_pid_fk;
[/code]
约束分为以下5种:
主键 ---唯一(表中只有一个主键),非空,不重复
唯一约束
检查约束: 检查一个列的内容是否合法
|---例如:年龄:0~150岁
非空约束
外键约束: 在两张表中进行约束的操作
create table person(
pid varchar2(10) primary key
)
Oracle错误信息:
ORA-0001:违反唯一性约束条件(SCOTT.SYS_C005270)
错误信息上给出的是一个编号的形式,实际上此编号就是表示约束的名称,是系统分配的名称
如果我们想自己去定义这个名称呢?
使用constraint
create table person(
pid varchar2(10),
constraint person_pid_pk primary key(pid)
)
Oracle错误信息:
ORA-0001:违反唯一性约束条件(SCOTT.person_pid_pk)
create table person(
pid varchar2(10),
name varchar2(20) not null, //因为非空约束在数据库的错误信息会明确指出来,所以也就没必要用constraint重命名了
constraint person_pid_pk primary key(pid)
)
唯一约束也是可以重命名
create table person(
pid varchar2(10),
name varchar2(20) unique not null,
constraint person_pid_pk primary key(pid)
)
create table person(
pid varchar2(10),
name varchar2(20) not null,
constraint person_pid_pk primary key(pid),
constraint person_name_uk unique(name)
)
检查约束: check
create table person(
pid varchar2(10),
name varchar2(20) not null,
age number(3) not null check(age between 0 and 150),
sex varchar2(2) default '男' check(sex in ('男','女','中')),
constraint person_pid_pk primary key(pid),
constraint person_name_uk unique(name)
)
因为错误信息也是自动的一个名字,所以我们可以重命名
create table person(
pid varchar2(10),
name varchar2(20) not null,
age number(3) not null ,
sex varchar2(2) default '男' ,
constraint person_pid_pk primary key(pid),
constraint person_name_uk unique(name),
constraint person_age_ck check(age between 1 and 150),
constraint person_sex_ck check(sex in ('男','女','中'))
)
主外键约束(foreign key)---正对两张表的约束
如果在一张表中有外键,那么插入这张表的数据时,这个外键必须存在,如果外键没有
则不能插入,会报错说:找不到父项关键字
create table book(
bid number primary key,
bname varchar2(5) not null,
pid varchar(18),
constraint person_book_pid_fk foreign key(pid) references person(pid) //想成挂载到person表的pid上,作为一个叶子节点
)
删除时候,先删除子表再删除父表。。。
如果我想不管外键直接删除怎么办。。。
添加的时候如果没有父亲,当然无法挂载啦
drop table person cascade constraints; //级联的翻译不好,翻译成忽略约束吧
如果希望一个表中的数据在删除时,可以自动删除掉其对应子表记录,则就可以使用级联删除操作,需要在定义表时候做出来
create table book(
bid number primary key,
bname varchar2(5) not null,
pid varchar(18),
constraint person_book_pid_fk foreign key(pid) references person(pid) on delete cascade//当删除父亲的时候,对应的孩子也会被删除
)
修改约束:(了解)
此时,需要为表中添加若干个约束,添加约束的语法如下:
alter table 表名称 add constraint 约束名称 约束类型(约束字段)
删除约束:
alter table book drop constraint book_pid_fk;
[/code]