数据库______约束小结

1 约束概述

作用:

1.定义规则

2.确保完整性 精确 可靠

2 非空约束

在创建表时设置非空约束

create table userinfo_1(
id number(6),
username varchar2(20) not null,
userpwd varchar2(20) not null);

SQL> desc userinfo_1
名称 是否为空? 类型


ID NUMBER(6)
USERNAME NOT NULL VARCHAR2(20)
USERPWD NOT NULL VARCHAR2(20)

不插入数据会显示错误

SQL> insert into userinfo_1(id)
2 values(1);
insert into userinfo_1(id)
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 (“SYSTEM”.”USERINFO_1”.”USERNAME”)

在修改时添加非空约束

**ALTER TABLE table_name
MODIFY column_name datetype NOT NULL;**

SQL> alter table userinfo
2 modify username varchar2(20) not null;

表已更改。

SQL> desc userinfo;
名称 是否为空? 类型


ID NUMBER(6)
USERNAME NOT NULL VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE

除去非空约束

**ALTER TABLE table_name
MODIFY column_name datatype NULL;**

SQL> alter table userinfo
2 modify username varchar(20) null;

表已更改。

SQL> desc userinfo
名称 是否为空? 类型


ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE

3 **主键约束
作用:确保每一行数据的唯一性
一张表只能设计一个主键约束
主键约束可以由多个字段构成(联合主键,复合主键)**

**在创建表时设置主键约束
PRIMARY KEY**

SQL> create table userinfo_p(
2 id number(6) 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)

*表级约束:
CONSTRAINT constraint_name PRIMARY key(column_name1,…)*

SQL> create table userinfo_p1(
2 id number(6),
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> 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> select constraint_name from user_constraints where table_name = ‘USERINFO_P1’;

**CONSTRAINT_NAME
——————————**
PK_ID_USERNAME

SQL> select constraint_name from user_constraints where table_name = ‘USERINFO_P’;

CONSTRAINT_NAME

SYS_C0011106

**在修改表时添加主键约束
ADD CONSTRAINT constraint_name
PRIMARY KEY(column_name1,…);**

SQL> desc userinfo
名称 是否为空? 类型


ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)
EMAIL VARCHAR2(30)
REGDATE DATE

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

更改约束名称

**RENAME CONSTRAINT old_name
TO new_name**

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

**删除主键约束
DISABLE|ENABLE CONSTRAINT constraint_name;**

SQL> alter table userinfo
2 disable constraint new_pk_id;

表已更改。

SQL> select constraint_name,status from user_constraints where table_name = ‘USERINFO’;

CONSTRAINT_NAME STATUS


NEW_PK_ID DISABLED

DROP CONSTRAINT constraint_name;

SQL> alter table userinfo
2 drop constraint new_pk_id;

表已更改。

SQL> select constraint_name from user_constraints where table_name = ‘USERINFO’;

未选定行

DROP PRIMARY KEY[CASCADE]

SQL> desc userinfo_p
名称 是否为空? 类型


ID NOT NULL NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)

SQL> alter table userinfo_p
2 drop primary key;

表已更改。

SQL> desc userinfo_p
名称 是否为空? 类型


ID NUMBER(6)
USERNAME VARCHAR2(20)
USERPWD VARCHAR2(20)

在创建表时添加外键约束(列级)

**在创建表时设置外键约束
table1 从表
REFERENCES table2(column_name,…);
主表
设置外键约束时,主表字段必须是主键。**

SQL> create table typeinfo(
2 typeid varchar2(20) 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
2 values(1,1);

已创建 1 行。

SQL> insert into userinfo_f
2 (id,typeid_new)values(1,2);
insert into userinfo_f
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SYSTEM.SYS_C0011111) - 未找到父项关键字

SQL> insert into userinfo_f
2 (id,typeid_new)values(1,1);

已创建 1 行。

SQL> insert into userinfo_f
2 (id,typeid_new)values(2,null);

已创建 1 行。

SQL> select * from userinfo_f;

ID USERNAME TYPEID_NEW


1 1
2

**5 在创建表时设置外键约束(表级)
CONSTRAINT constraint_name FOREIGN
KEY(column_name)REFERENCES
table_name(column_name)[ON DELETE CASCADE]**

SQL> create table userinfo_f2(
2 id varchar2(10) primary key,
3 username varchar2(20),
4 typeid_new varchar2(10),
5 constraint fk_typeid_new foreign key(typeid_new)
6 references typeinfo(typeid));

表已创建。

SQL> create table userinfo_f3(
2 id varchar2(10) primary key,
3 username varchar2(20),
4 typeid_new varchar2(10),
5 constraint fk_typeid_new foreign key(typeid_new)
6 references typeinfo(typeid) on delete cascade);
constraint fk_typeid_new foreign key(typeid_new)
*
第 5 行出现错误:
ORA-02264: 名称已被一现有约束条件占用

SQL> create table userinfo_f3(
2 id varchar2(10) primary key,
3 username varchar2(20),
4 typeid_new varchar2(10),
5 constraint fk_typeid_new1 foreign key(typeid_new)
6 references typeinfo(typeid) on delete cascade);

表已创建。

**7 在修改表时添加外键约束
ADD CONSTRAINT constraint_name FOREIGN KRY(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));

**8 删除外键约束
DISABLE|ENABLE CONSTRAINT constraint_name;**

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_F4’;

CONSTRAINT_NAME C STATUS


SYS_C0011117 P ENABLED
FK_TYPEID_ALTER R ENABLED

SQL> alter table userinfo_f4 disable constraint fk_typeid_alter;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_F4’;

CONSTRAINT_NAME C STATUS


SYS_C0011117 P ENABLED
FK_TYPEID_ALTER R DISABLED

**彻底删除
DROP CONSTRAINT constraint_name;**

SQL> alter table userinfo_f4 drop constraint fk_typeid_alter;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_F4’;

CONSTRAINT_NAME C STATUS


SYS_C0011117 P ENABLED

**9 唯一约束
保证字段值唯一性
唯一和主键约束区别
唯一约束允许有空值
且可以有多个唯一约束
在创建表时设置唯一约束**

UNIQUE(列级)

SQL> create table userinfo_u(
2 id varchar2(10) primary key,
3 username varchar2(10) unique,
4 userpwd varchar2(20));

表已创建。

**表级
CONSTRAINT constraint_name UNIQUE(column_name);
(若设置多个,需要写多个子句,而不是在unique后写多个字段)**

SQL> create table userinfo_u1(
2 id varchar2(10) primary key,
3 username varchar2(10),
4 userpwd varchar2(20),
5 CONSTRAINT un_username unique(username));

表已创建。

**10 在修改表时添加唯一约束
ADD CONSTRAINT constraint_name UNIQUE(column_name);**

create table userinfo_u2(
id varchar2(10) primary key,
username varchar2(10),
userpwd varchar2(20));

**11 删除唯一约束
DISABLE|ENABLE CONSTRAINT constraint_name
DROP CONSTRAINT constraint_name;**

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_U2’;

CONSTRAINT_NAME C STATUS


SYS_C0011125 P ENABLED
UN_USERNAME1 U ENABLED

SQL> alter table userinfo_u2 disable constraint un_username1;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_U2’;

CONSTRAINT_NAME C STATUS


SYS_C0011125 P ENABLED
UN_USERNAME1 U DISABLED

SQL> alter table userinfo_u2 enable constraint un_username1;

表已更改。

SQL> alter table userinfo_u2 drop constraint un_username1;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_U2’;

CONSTRAINT_NAME C STATUS


SYS_C0011125 P ENABLED

**12 在创建表时设置检查约束
在创建表时设置检查约束
允许多个

列级
CHECK(expressions)**

create table userinfo_c(
id varchar2(10) primary key,
username varchar2(10),
salary number(5) check(salary > 0));

SQL> insert into userinfo_c values(1,’aaa’,-50);
insert into userinfo_c values(1,’aaa’,-50)
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SYSTEM.SYS_C0011127)

**表级
CONSTRAINT constraint_name check(expressions)**

create table userinfo_c1(
id varchar2(10) primary key,
username varchar2(10),
salary number(5),
CONSTRAINT ck_salary check(salary > 0));

**13 修改表时添加检查约束
ADD CONSTRAINT constraint_name check(expressions);**

create table userinfo_c2(
id varchar2(10) primary key,
username varchar2(10),
salary number(5));

SQL> create table userinfo_c2(
2 id varchar2(10) primary key,
3 username varchar2(10),
4 salary number(5));

表已创建。

SQL> alter table userinfo_c2 add constraint ck_salary_new check(salary > 0);

表已更改。

14 删除检查约束

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;

CONSTRAINT_NAME C STATUS


SYS_C0011131 P ENABLED
CK_SALARY_NEW C ENABLED

SQL> alter table userinfo_c2 disable constraint ck_salary_new;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;

CONSTRAINT_NAME C STATUS


SYS_C0011131 P ENABLED
CK_SALARY_NEW C DISABLED

SQL> alter table userinfo_c2 enable constraint ck_salary_new;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;

CONSTRAINT_NAME C STATUS


SYS_C0011131 P ENABLED
CK_SALARY_NEW C ENABLED

SQL> alter table userinfo_c2 drop constraint ck_salary_new;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name = ‘USERINFO_C2’;

CONSTRAINT_NAME C STATUS


SYS_C0011131 P ENABLED

15 约束小结

非空

主键

外键

唯一

检查

在创建表时创建约束

非空只在表级 无名字

在修改表时添加约束

非空 modify

更改约束名称

非空不能改

数据字典 user_constraints

RENAME CONSTRAINT old_name TO new_name

删除约束

非空 MODIFY
其他 DISABLE DROP

你可能感兴趣的:(数据库)