约束:
约束的作用:它是用来控制你具体输入的值要满足你设置好的一些要求的。
作用1:定义规则。也就是说你创建完一个表之后,你可以定义那些字段是你必须要输入的,那些字段需要输入一个什么样的值,在某一个范围内的值。
作用2:确保完整性。确保我们数据的精确性和可靠性。如果确保了数据的完整性,就可以防止一些错误的信息,无效的信息来输入。
Oracle中5个重要的约束:
非空约束、主键约束、外键约束、唯一约束、检查约束
- 非空约束
- 在创建表时设置非空约束
- CREATE TABLE table_name( column_name datatype NOT NULL,...);
- 例如:
create table userinfo_1
(
id number(6,0),
username varchar2(20) not null,
userpwd varchar2(20) not null
);
- 在修改表时添加非空约束
- ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
- 例如:(最好表中是没有值的,否则会报错)
alter table userinfo modify username varchar2(20) not null;
- 在修改表时去除非空约束
- ALTER TABLE table_name MODIFY column_name datatype NULL;
- 例如:(最好表中是没有值的,否则会报错) alter table userinfo modify username varchar2(20) null;
- 主键约束:
- 作用:确保表当中每一行数据的唯一性。要求:字段非空、唯一
- 一张表只能设计一个主键约束。主键约束可以由多个字段构成(联合主键或复合主键)
- 在创建表时设置主键约束
CREATE TABLE table_name(
column_name datatype
PRIMARY KEY,...
)
例如:
create table userinfo_p
( id number(6,0) primary key,
username varchar2(20),
userpwd varchar2(20)
);
CONSTRAINT constraint_name PRIMARY KEY(column_name1,...);
例如:
create table userinfo_p1
( id number(6,0)
username varchar2(20),
userpwd varchar2(20),
constraint pk_id_username primary key(id,username)
);
小技巧:查看某张表的约束,可以通过数据字典:
user_constraints
desc user_constraints;
select constraint_name from user_constraints where table_name='USERINF_P1';
- 在修改表时添加主键约束
- ADD CONSTRAINT costraint_name PRIMARY KEY(column_name1,...);
例如:
alter talbe userinfo add constraint pk_id primary key(id);
- 更改约束的名称
- RENAME CONSTRAINT old_name TO new_name
例如:
alter talbe userinfo rename constraint pk_id to new_pk_id;
- 删除主键约束
- 方法一:暂时不想用这个约束了,禁用这个约束
- DISABLE|ENABLE CONSTRAINT constraint_name
例如:
alter talbe userinfo disable constraint new_pk_id;
查看约束的状态
select constraint_name ,status from user_constraints where table_name='USERINFO';
- 方法二: 彻底删除约束
- DROP CONSTRAINT constraint_name
例如:
alter table userinfo drop constraint new_pk_id;
- 方法三:彻底删除约束
- DROP PRIMARY KEY[CASCADE]
说明:我们每一张表当中只有一个主键约束,因此我们在删除的时候,直接写主键约束这个关键字,就可以自动的将表中的主键约束去掉。CASCADE:用于级联的删除。如果两个表之间存在着外键约束的关系,我们使用CASCADE,这样的话,就可以把其它表引用我们这个字段的地方的约束删掉。
例如:alter table userinfo_p drop primary key;
- 在创建表时设置外键约束
- 方法一:CREATE TABLE table (column_name datatype REFERENCES table2(column_name),...);
例如:
1、先创建主表
create table typeinfo
(
typeid varchar2(10) primary key,
typename varchar2(20)
);
2、再创建从表
create table userinfo_f
(
id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10) references typeinfo(typeid)
);
设置完成,我们测试一下:
insert into typeinfo values(1,1);
insert into userinfo_f(id,typeid_new) values(1,2);报错
insert into userinfo_f(id,typeid_new) values(1,1);
insert into userinfo_f(id,typeid_new) values(1,null);
- 方法二:CONSTRAINT constraint_name FOREIGN KEY(column_name)
REFERENCES table_name(column_name)[ON DELETE CASCADE];
说明:ON DELETE CASCADE级联删除。主表当中的一条数据删除后,从表当中使用
了这条数据字段所在行也会被一起删除,这样的话,就确保了主从表数据的完整性。
例如:
create table userinfo_f2
(
id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10),
constraint fk_typeid_new foreign key(typeid_new) references typeinfo(typeid)
);
create table userinfo_f3
(
id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10),
constraint fk_typeid_new1 foreign key(typeid_new) references typeinfo(typeid) not delete cascade
);
- 在修改表时添加外键约束
- ADD CONSTRAINT constraint_name FOREIGN KEY(column_name)
REFERENCES table_name(column_name)[ON DELETE CASCADE]
例如:
create table userinfo_f4
(
id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10)
)
;
alter table userinfo_f4 add constraint fk_typeid_alter foreign key(typeid_new) references typeinfo(typeid);
- 删除外键约束
- 禁用外键约束:DISABLE | ENABLE CONSTRAINT constraint_name
例如:
select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_F4';
alter table userinfo_f4 diable constraint FK_TYPE_ALTER;
- 彻底删除外键约束:DROP CONSTRAINT constraint_name;
例如: alter table userinfo_f4 drop constraint FK_TYPE_ALTER;
- 唯一约束:
- 作用:保证字段的唯一性。
- 唯一约束和主键约束的区别:主键字段值必须是非空的。唯一约束允许有一个空值。主键在每一张表中只能有一个。唯一约束在每张表中可以有多个。
- 在创建表时设置唯一约束
- 方法一:CREATE TABLE table_name(column_name datatype UNIQUE,...);
例如:
create table userinfo_u
(
id varchar2(10) primary key,
username varchar2(10) unique,
userpwd varchar2(10)
);
- 方法二:CONSTRAINT constraint_name UNQIUE(column_name);
例如:
create table userinfo_u1
(
id varchar2(10) primary key,
username varchar2(20),
constraint un_username unique(username)
);
- 在修改表时添加唯一约束
- ADD CONSTRAINT constraint_name UNIQUE(column_name);
例如:
create table userinfo_u2
(
id varchar2(10) primary kry,
username varchar2(20)
);
alter table userinfo_u2 add constraint un_username_new unique(username);
- 删除唯一约束
- DISABLE | ENABLE CONSTRAINT constraint_name;
- DROP CONSTRAINT constraint_name;
- 检查约束:
- 作用:表中的值更具有实际意义
- 在创建表时设置检查约束
- 方法一:CREATE TABLE table_name(column_name datatype CHECK(expressions),...);
例如:
create table userinfo_c
(
id varchar2(10) primary key,
username varchar2(20),
salary number(5,0) check(salary>0)
);
insert into userinfo_c values(1,'aaa',-50);报错,违反了检查约束。
- 方法二:CONSTRAINT constraint_name CHECK(expressions);
例如:
create table userinfo_c1
(
id varchar2(10) primary key,
username varchar2(20),
salary number(5,0);
constraint ck_salary check(salary>0)
);
- 在修改表时添加检查约束
- ADD CONSTRAINT constraint_name CHECK(expressions);
例如:
create table userinfo_c3
(
id varchar2(10) primary key,
username varchar2(20),
salary number(5,0)
);
alter table userinfo_c3 add constraint ck_salary_new check(salary>0);
- 删除检查约束
- DISABLE | ENABLE CONSTRAINT constraint_name;
- DROP CONSTRAINT constraint_name;
- 总结:
- 在创建表时设置约束。
- 非空约束只能在列级设置,不能再表级设置。其他约束即可在列级设置也可以在表级设置。
- 更改约束的名称。
- 数据字典(user_constraints)
- RENAME CONSTRAINT old_name TO new_name;