zoukankan      html  css  js  c++  java
  • 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. 删除检查约束:

  • 相关阅读:
    shell脚本 加密备份MySQL数据库
    C#在Linux下获取文件夹信息(所在磁盘总大小,使用空间,已用空间,使用率)
    bootstrap--- 两种bootstrap multiselect组件大比拼
    C# 文件重命名
    C#中一些常用的正则表达式
    C# 文件压缩加解密
    Python 由__dict__和dir()引发的一些思考
    python3随机生成中文字符
    Django自定义过滤器中is_safe和need_autoescape两个参数的理解
    Python格式化字符串--format
  • 原文地址:https://www.cnblogs.com/blogofwyl/p/4824802.html
Copyright © 2011-2022 走看看