oracle----约束

约束的作用?

用来定义一些规则!确保数据的完整性,精确性,可靠性。防止错误或者无效的信息输入。

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. 删除检查约束:

原文地址:https://www.cnblogs.com/blogofwyl/p/4824802.html