Oracle的约束


Oracle的约束

一、简介

  • 定义规则
  • 确保完整性

二、非空约束

1、在创建表时设置非空约束

  • create table 表名(列名 数据类型 not null,…);
# 建表
SQL> create table userinfo_1 (id number(6,0), 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)
 
# 插入id,失败
SQL> insert into userinfo_1(id) values(1);
insert into userinfo_1(id) values(1)
*1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SYSTEM"."USERINFO_1"."USERNAME")

# 插入数据
SQL> insert into userinfo_1(id,username,userpwd) values(1,'jack','123123');

已创建 1 行。

# 查询表中数据
SQL> select * from userinfo_1;

        ID USERNAME             USERPWD
---------- -------------------- --------------------
         1 jack                 123123

2、在修改表时添加非空约束

  • alter table 表名 modify 列名 数据类型 not null;
# 尝试在修改表时添加非空约束,发现报错,需要把表中数据删除,再添加非空约束
SQL> alter table userinfo modify username varchar2(20) not null;
alter table userinfo modify username varchar2(20) not null
*1 行出现错误:
ORA-02296: 无法启用 (SYSTEM.) - 找到空值

# 删除表中数据
SQL> delete from userinfo;

已删除3行。

# 在修改表时添加非空约束
SQL> alter table userinfo 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

3、在修改表时去除非空约束

  • alter table 表名 modify 列名 数据类型 null;
SQL> alter table userinfo modify username varchar2(20) null;

表已更改。

SQL> desc userinfo
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(6)
 USERNAME                                           VARCHAR2(20)
 USERPWD                                            VARCHAR2(20)
 EMAIL                                              VARCHAR2(30)
 REGDATE                                            DATE

三、主键约束

1、简介

  • 一张表只能设计一个主键约束
  • 主键约束可以由多个字段构成(联合主键或复合主键)

在这里插入图片描述

2、在创建表时设置主键约束

  • create table 表名(列名 数据类型 primary key,…);
SQL> create table userinfo_p (id number(6,0) primary key, username varchar2(20), userpwd varchar2(20));

表已创建。

SQL> desc userinfo_p;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(6)
 USERNAME                                           VARCHAR2(20)
 USERPWD                                            VARCHAR2(20)
  • create table 表名(列名1 数据类型1,constraint 主键约束名 primary key(列名1,…);
SQL> create table userinfo_p1 (id number(6,0), username varchar2(20), userpwd varchar2(20), 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_C0011161

3、在修改表时添加主键约束

  • alter table 表名 add constraint 主键约束名 primary key(列名1,…);
SQL> alter table userinfo add constraint pk_id primary key(id);

表已更改。

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';

CONSTRAINT_NAME
------------------------------
PK_ID

4、更改主键约束的名称

  • alter table 表名 rename constraint 旧主键名 to 新主键名
SQL> alter table userinfo rename constraint pk_id to new_pk_id;

表已更改。

SQL> select constraint_name from user_constraints where table_name='USERINFO';

CONSTRAINT_NAME
------------------------------
NEW_PK_ID

5、禁用主键约束

  • alter table 表名 disable|enable constraint 主键名
SQL> alter table userinfo disable constraint new_pk_id;

表已更改。

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

CONSTRAINT_NAME                STATUS
------------------------------ --------
NEW_PK_ID                      DISABLED

6、删除主键约束

  • alter table 表名 drop constaint 主键名
SQL> alter table userinfo drop constraint new_pk_id;

表已更改。

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

未选定行

四、外键约束

1、自动删除主键约束

  • alter table 表名 drop primary key;
SQL> desc userinfo_p
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(6)
 USERNAME                                           VARCHAR2(20)
 USERPWD                                            VARCHAR2(20)
 
SQL> alter table userinfo_p drop primary key;

表已更改。

SQL> desc userinfo_p
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(6)
 USERNAME                                           VARCHAR2(20)
 USERPWD                                            VARCHAR2(20)

2、在创建表时设置外键约束

  • create table 表名1(列名 数据类型 references 表名2(列名),…)
    • 从表中外键字段的值必须来自主表中的相应字段的值,或者位null值
    • table1从表,在创建表时设置外键约束
    • table2主表,主从表中相应的字段必须时同一个数据类型
SQL> create table typeinfo (typeid varchar2(10) primary key, typename varchar2(20));

表已创建。

SQL> create table userinfo_f (id varchar2(10) primary key, username varchar2(20), typeid_new varchar2(10) references typeinfo(typeid));

表已创建。

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_C0011167) - 未找到父项关键字

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

已创建 1 行。

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

已创建 1 行。
  • create table 表名 (字段名1 数据类型1, …, constraint 外键约束名 foreing key(列名) references 表名(列名) [on delete cascade];
SQL> 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));

表已创建。

SQL> 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、在修改表时添加外键约束

  • create table 表名 add constraint 外键约束名 foreign key(列名) references 表名(列名) [on delete cascade];
SQL> create table userinfo_f4 (id varchar2(10) primary key, username varchar2(20), typeid_new varchar2(10));

表已创建。

SQL> alter table userinfo_f4 add constraint fk_typeid_alter foreign key(typeid_new) references typeinfo(typeid);

表已更改。

4、禁用外键约束

  • disable|enable constraint 外键约束名;
SQL> select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_F4';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
SYS_C0011172                   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_C0011172                   P ENABLED
FK_TYPEID_ALTER                R DISABLED

5、删除外键约束

  • drop constraint 外键约束名;
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_C0011172                   P ENABLED

五、唯一约束

1、简介

  • 唯一约束和主键约束的区别:
    • 主键字段值必须是非空的
    • 唯一约束允许有一个空值
    • 主键在每张表中只能有一个
    • 唯一约束在每张表中可以有多个

2、在创建表时设置唯一约束

  • create table 表名 (字段名 数据类型 unique,…);
SQL> create table userinfo_u (id varchar2(10) primary key, username varchar2(20) unique, userpwd varchar2(20));

表已创建。
  • create table 表名 (字段名1 数据类型1,… constraint 唯一约束名 unique(字段名));
SQL> create table userinfo_u1 (id varchar2(10) primary key, username varchar2(20), constraint un_username unique(username));

表已创建。

3、在修改表时添加唯一约束

  • create table 表名 add constraint 唯一约束名 unique(字段名);
SQL> create table userinfo_u2 (id varchar2(10) primary key, username varchar2(20));

表已创建。

SQL> alter table userinfo_u2 add constraint un_username_new unique(username);

表已更改。

4、禁用唯一约束

  • alter table 表名 disable|enable constraint 唯一约束名
SQL> alter table userinfo_u2 disable constraint UN_USERNAME_NEW;

表已更改。

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

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
SYS_C0011178                   P ENABLED
UN_USERNAME_NEW                U DISABLED

5、删除唯一约束

  • alter table 表名 drop constraint 唯一约束名;

SQL> alter table userinfo_u2 drop constraint UN_USERNAME_NEW;

表已更改。

六、检查约束

1、简介

  • 时表中的值更加有实际意义

2、在创建表时设置检查约束

  • create table 表名 (字段名 数据类型 check(表达式), …);
SQL> create table userinfo_c (id varchar2(10) primary key, username varchar2(20), salary number(5,0) 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_C0011180)

SQL> insert into userinfo_c values(1,'aaa',50);

已创建 1 行。
  • alter table 表名(字段名1 数据类型1, …, constraint 约束名 check(表达式));
SQL> create table userinfo_c1 (id varchar2(10) primary key, username varchar2(20), salary number(5,0), constraint ck_salary check(salary>0));

表已创建。

3、在修改表时添加检查约束

  • alter table 表名 add constraint 约束名 check(表达式);
SQL> create table userinfo_3 (id varchar2(10) primary key, username varchar2(20), salary number(5,0));

表已创建。

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

表已更改。

4、禁止检查约束

  • disable|enable constraint 约束名
SQL> desc userinfo_3
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL VARCHAR2(10)
 USERNAME                                           VARCHAR2(20)
 SALARY                                             NUMBER(5)

SQL> select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_3';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
SYS_C0011184                   P ENABLED
CK_SALARY_NEW                  C ENABLED

SQL> alter table userinfo_3 disable constraint ck_salary_new;

表已更改。

SQL> select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_3';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
SYS_C0011184                   P ENABLED
CK_SALARY_NEW                  C DISABLED

5、删除检查约束

  • drop constraint 约束名
SQL> alter table userinfo_3 drop constraint ck_salary_new;

表已更改。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值