约束的作用?
用来定义一些规则!确保数据的完整性,精确性,可靠性。防止错误或者无效的信息输入。
oracle中的5中约束:
一. 非空约束
字段是必须输入的,必须存在;
(1),创建表时创建非空约束;
语法:
CREATE TABLE table_name( column1_name datatype NOT NULL...... )
SQL> create table userinfo_1( 2 id number(6,0), 3 username varchar2(20) not null, 4 userpwd varchar2(20) not null 5 ); 表已创建。 SQL> desc userinfo_1 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER(6) USERNAME NOT NULL VARCHAR2(20) USERPWD NOT NULL VARCHAR2(20) SQL>
(2),在修改表时添加非空约束;
语法:
ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
当修改表的时候如果表中有数据可能导致修改错误,如下!
SQL> alter table userinfo 2 modify username varchar2(20) not null; alter table userinfo * 第 1 行出现错误: ORA-02296: 无法启用 (SYSTEM.) - 找到空值 SQL> delete from userinfo; 已删除4行。 SQL> alter table userinfo 2 modify username varchar(20) not null; 表已更改。 SQL> desc userinfo; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER(6) USERNAME NOT NULL VARCHAR2(20) USERPWD VARCHAR2(20) EMAIL VARCHAR2(30) REGDATE DATE SQL>
(3),修改表时去除非空约束;
语法:
ALTER TABLE table_name MODIFY column_name datatype NULL;
SQL> desc userinfo; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER(6) USERNAME NOT NULL VARCHAR2(20) USERPWD VARCHAR2(20) EMAIL VARCHAR2(30) REGDATE DATE SQL> SQL> ALTER table userinfo 2 modify username varchar2(20) null; 表已更改。 SQL> desc userinfo; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER(6) USERNAME VARCHAR2(20) USERPWD VARCHAR2(20) EMAIL VARCHAR2(30) REGDATE DATE SQL>
二. 主键约束
主键约束确定表中的每行数据的唯一性;一张表中只可以设置一个主键约束,但是可以设置多个字段为主键(联合主键);
(1),创建表时设置主键约束:
语法:
CREATE TABLE table_name( column_name datatype PRIMARY KEY,...... );
SQL> SQL> create table userinfo_p( 2 id number(6,0) primary key, 3 username varchar2(20), 4 userpwd varchar2(20)); 表已创建。 SQL> desc userinfo_p; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NOT NULL NUMBER(6) USERNAME VARCHAR2(20) USERPWD VARCHAR2(20) SQL>
创建联合主键约束:
语法:
CONSTRAINT constraint_name PRIMARY KEY(column_name1,......)
以上语句放在所有字段都写完之后的后面,用于创建联合主键约束!表级约束。
SQL> create table userinfo_p1( 2 id number(6,0), 3 username varchar2(20), 4 userpwd varchar2(20), 5 constraint pk_id_username primary key(id,username)); 表已创建。 SQL> desc userinfo_p1; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NOT NULL NUMBER(6) USERNAME NOT NULL VARCHAR2(20) USERPWD VARCHAR2(20) SQL>
查询某一张表的约束时:
SQL> desc user_constraints; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OWNER VARCHAR2(30) CONSTRAINT_NAME NOT NULL VARCHAR2(30) CONSTRAINT_TYPE VARCHAR2(1) TABLE_NAME NOT NULL VARCHAR2(30) SEARCH_CONDITION LONG R_OWNER VARCHAR2(30) R_CONSTRAINT_NAME VARCHAR2(30) DELETE_RULE VARCHAR2(9) STATUS VARCHAR2(8) DEFERRABLE VARCHAR2(14) DEFERRED VARCHAR2(9) VALIDATED VARCHAR2(13) GENERATED VARCHAR2(14) BAD VARCHAR2(3) RELY VARCHAR2(4) LAST_CHANGE DATE INDEX_OWNER VARCHAR2(30) INDEX_NAME VARCHAR2(30) INVALID VARCHAR2(7) VIEW_RELATED VARCHAR2(14) SQL>
SQL> select constraint_name from user_constraints where table_name='USERINFO_P1'; CONSTRAINT_NAME ------------------------------ PK_ID_USERNAME SQL>
(2),修改表时添加主键约束:
语法:
Add CONSTRAINT constraint_name PRIMARY KEY (column_name1,...)
SQL> alter table userinfo 2 add constraint pk_id primary key(id); 表已更改。 SQL> desc userinfo 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NOT NULL NUMBER(6) USERNAME VARCHAR2(20) USERPWD VARCHAR2(20) EMAIL VARCHAR2(30) REGDATE DATE
(3),更改约束的名称:
语法:
RENAME CONTRAINT old_name TO new_name;
实例:
SQL> SQL> alter table userinfo 2 rename constraint pk_id TO new_pk_id; 表已更改。 查询约束 SQL> select constraint_name from user_constraints where table_name='USERINFO'; CONSTRAINT_NAME ------------------------------ NEW_PK_ID
(4),删除主键约束(禁止使用当前的主键约束):
语法:
DISABLE | ENABLE CONSTRAINT constraint_name;
删除表的约束之后查看删除状态:
SQL> alter table userinfo 2 disable constraint new_pk_id; 表已更改。 SQL> select constraint_name from user_constraints where table_name='USERINFO'; CONSTRAINT_NAME ------------------------------ NEW_PK_ID SQL> select constraint_name,status from user_constraints where table_name='USERINFO'; CONSTRAINT_NAME STATUS ------------------------------ -------- NEW_PK_ID DISABLED SQL>
删除主键约束:
DROP CONSTRANT constraint_name;
SQL> alter table userinfo 2 drop constraint new_pk_id; 表已更改。 SQL> select constraint_name,status from user_constraints where table_name='USERINFO'; 未选定行 SQL> select constraint_name from user_constraints where table_name='USERINFO'; 未选定行 SQL>
方法3:
DROP PRIMARY KEY [CASCADE]
[CASCADE]:用于级联删除;
SQL> alter table userinfo_p 2 drop primary key ; 表已更改。 SQL> select constraint_name from user_constraints where table_name='USERINFO_P'; 未选定行 SQL> desc userinfo_p 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER(6) USERNAME VARCHAR2(20) USERPWD VARCHAR2(20) SQL>
三. 外键约束
1. 在创建表的时候进行设置:
语法:
CREATE TABLE table1 (column_name datatype REFERENCES table2(column_name),...)
注意:
设置外键约束时,主表的字段必须是主键。
主从表中的相应的字段必须是同一个数据类型。
从表中外键字段的值必须来自主表中的相应字段的值,或者为null;
实例1;
SQL> create table typeinfo( 2 typeid varchar2(10) primary key, 3 typename varchar2(20)); 表已创建。 SQL> create table userinfo_f( 2 id varchar2(10) primary key, 3 username varchar2(20), 4 typeid_new varchar2(10) references typeinfo(typeid)); 表已创建。 SQL> insert into typeinfo(1,1); insert into typeinfo(1,1) * 第 1 行出现错误: ORA-00928: 缺失 SELECT 关键字 SQL> insert into typeinfo values(1,1); 已创建 1 行。 SQL> insert into userinfo_f(id,typeid_new) values(1,2); insert into userinfo_f(id,typeid_new) values(1,2) * 第 1 行出现错误: ORA-02291: 违反完整约束条件 (SYSTEM.SYS_C0011132) - 未找到父项关键字 SQL> insert into userinfo_f(id,typeid_new) values(1,1); 已创建 1 行。 SQL> insert into userinfo_f(id,typeid_new) values(2,null); 已创建 1 行。 SQL>
2, 在创建表时创建外键约束:
语法:
CONSTRAINT constraint_name FOREIGN KEY(column_name) REFENENCES table_name(column_name)[ON DELETE CASCADE] CASCADE:级联删除
实例:
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) on delete cascade);
3 修改表时添加外键约束:
语法:
ADD CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name)[ON DELETE CASCADE]
QL> SQL> create table userinfo_f4( 2 id varchar2(20) primary key, 3 username varchar2(20), 4 typeid_new varchar(10)); 表已创建。 SQL> alter table userinfo_f4 2 add constraint fk_typeid_alter foreign key(typeid_new) references typeinfo(typeid) on delete cascade; 表已更改。 SQL>
4. 删除外键约束
1),禁用外键约束:
语法:
DISABLE | ENABLE CONSTRAINT constraint_name
查询约束:
SQL> select constraint_name, constraint_type,status from user_constraints 2 where table_name='USERINFO_F4'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011151 P ENABLED FK_TYPEID_ALTER R ENABLED SQL>
SQL> select constraint_name, constraint_type,status from user_constraints 2 where table_name='USERINFO_F4'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011151 P ENABLED FK_TYPEID_ALTER R ENABLED SQL> alter table userinfo_f4 2 disable constraint FK_TYPE_ALTER; alter table userinfo_f4 SQL> alter table userinfo_f4 2 disable constraint FK_TYPEID_ALTER; 表已更改。 SQL> select constraint_name, constraint_type,status from user_constraints 2 where table_name='USERINFO_F4'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011151 P ENABLED FK_TYPEID_ALTER R DISABLED SQL>
重新启用外键约束:
SQL> select constraint_name, constraint_type,status from user_constraints 2 where table_name='USERINFO_F4'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011151 P ENABLED FK_TYPEID_ALTER R DISABLED SQL> alter table userinfo_f4 2 enable constraint FK_TYPEID_ALTER; 表已更改。 SQL> select constraint_name, constraint_type,status from user_constraints 2 where table_name='USERINFO_F4'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011151 P ENABLED FK_TYPEID_ALTER R ENABLED SQL
2),彻底删除外键约束:
SQL> SQL> alter table userinfo_f4 2 drop constraint FK_TYPEID_ALTER; 表已更改。 SQL> select constraint_name, constraint_type,status from user_constraints 2 where table_name='USERINFO_F4'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011151 P ENABLED SQL>
四. 唯一约束: 保证值得唯一性。主键约束也可以保证外溢性,但是主键中是非空的,并且只能有一个主键。但是唯一约束可以在一张表中有多个。
1), 在创建表时设置唯一约束:
语法
CRETAE TABLE table_name (column_name datatype UNIQUE,... )
在列级设置唯一约束:
SQL> CREATE table userinfo_u( 2 id varchar2(10) primary key, 3 username varchar2(20) unique, 4 userpwd varchar2(10)); 表已创建。
在表级设置唯一约束:
SQL> create table userinfo_u1( 2 id varchar2(10) primary key, 3 username varchar2(20), 4 constraint un_username unique(username)); 表已创建。
在修改表的时候添加唯一约束:
语法:
ADD CONSTRAINT constraint_name UNIQUE(column_name);
SQL> create table userinfo_u2( 2 id varchar2(20) primary key, 3 username varchar2(20)); 表已创建。 SQL> alter table userinfo_u2 2 add constraint un_username_new unique(username); 表已更改。 SQL>
删除唯一约束:
1. 禁用唯一约束:
SQL> select constraint_name,constraint_type,status from user_constraints 2 where table_name='USERINFO_U2'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011157 P ENABLED UN_USERNAME_NEW U ENABLED SQL> alter table userinfo_u2 2 disable constraint UN_USERNAME_NEW; 表已更改。 SQL> select constraint_name,constraint_type,status from user_constraints 2 where table_name='USERINFO_U2'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011157 P ENABLED UN_USERNAME_NEW U DISABLED SQL>
2. 删除唯一约束:
SQL> alter table userinfo_u2 2 drop constraint UN_USERNAME_NEW; 表已更改。 SQL> select constraint_name,constraint_type,status from user_constraints 2 where table_name='USERINFO_U2'; CONSTRAINT_NAME C STATUS ------------------------------ - -------- SYS_C0011157 P ENABLED SQL>
五.检查约束
1. 在创建表时设置检查约束:
SQL> SQL> create table userinfo_c( 2 id varchar2(20) primary key, 3 username varchar2(20), 4 salary number(5,0) check(salary > 0)); 表已创建。 SQL> insert into userinfo_c values(1,'www',-123); insert into userinfo_c values(1,'www',-123) * 第 1 行出现错误: ORA-02290: 违反检查约束条件 (SYSTEM.SYS_C0011159) SQL> create table userinfo_c1( 2 id varchar2(10) primary key, 3 username varchar2(20), 4 salary number(6,0), 5 constraint ck_salary check(salary>0)); 表已创建。 SQL>
2. 在修改表示添加检查约束
3. 删除检查约束: