Oracle学习笔记(4)——约束

约束:
约束的作用:它是用来控制你具体输入的值要满足你设置好的一些要求的。
作用1:定义规则。也就是说你创建完一个表之后,你可以定义那些字段是你必须要输入的,那些字段需要输入一个什么样的值,在某一个范围内的值。
作用2:确保完整性。确保我们数据的精确性和可靠性。如果确保了数据的完整性,就可以防止一些错误的信息,无效的信息来输入。

Oracle中5个重要的约束:
非空约束、主键约束、外键约束、唯一约束、检查约束
  • 非空约束
    • 在创建表时设置非空约束
      • CREATE TABLE table_name( column_name datatype NOT NULL,...);
      • 例如:
                           create table userinfo_1
                           (
                                   id number(6,0),
                                   username varchar2(20) not null,
                                   userpwd varchar2(20) not null
                          );
Oracle学习笔记(4)——约束_第1张图片
  • 在修改表时添加非空约束
    • ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
    • 例如:(最好表中是没有值的,否则会报错)
                                alter table userinfo modify username varchar2(20) not null;
Oracle学习笔记(4)——约束_第2张图片
    • 在修改表时去除非空约束
      • ALTER TABLE table_name MODIFY column_name datatype NULL;
      • 例如:(最好表中是没有值的,否则会报错) alter table userinfo modify username varchar2(20) null;
Oracle学习笔记(4)——约束_第3张图片
  • 主键约束:
    • 作用:确保表当中每一行数据的唯一性。要求:字段非空唯一
    • 一张表只能设计一个主键约束。主键约束可以由多个字段构成(联合主键或复合主键)
    • 在创建表时设置主键约束
      • 方法一:
                              CREATE TABLE table_name(
                                     column_name datatype  PRIMARY KEY,...
                               )
                               例如:
                               create table userinfo_p
                                ( id number(6,0) primary key,
                                   username  varchar2(20),
                                   userpwd    varchar2(20)
                                 );
Oracle学习笔记(4)——约束_第4张图片
  • 方法二:
                            CONSTRAINT constraint_name PRIMARY KEY(column_name1,...);
                            例如:
                             create table userinfo_p1
                             (  id number(6,0)
                                username varchar2(20),
                                userpwd varchar2(20),
                                constraint pk_id_username primary key(id,username)
                              );
                              小技巧:查看某张表的约束,可以通过数据字典: user_constraints
                               desc user_constraints;
                               select constraint_name from user_constraints where table_name='USERINF_P1';
Oracle学习笔记(4)——约束_第5张图片
  • 在修改表时添加主键约束
    • ADD CONSTRAINT costraint_name PRIMARY KEY(column_name1,...);
                         例如:
                           alter talbe userinfo add constraint pk_id primary key(id);
Oracle学习笔记(4)——约束_第6张图片
  • 更改约束的名称
    • RENAME CONSTRAINT old_name TO new_name
                         例如:
                           alter talbe userinfo rename constraint pk_id to new_pk_id;
  • 删除主键约束
    • 方法一:暂时不想用这个约束了,禁用这个约束
      • DISABLE|ENABLE CONSTRAINT constraint_name
                                   例如:
                                   alter talbe userinfo disable constraint new_pk_id;
                                  查看约束的状态
                                  select constraint_name ,status from user_constraints where table_name='USERINFO';
Oracle学习笔记(4)——约束_第7张图片
  • 方法二: 彻底删除约束 
    • DROP CONSTRAINT constraint_name
                                    例如:
                                    alter table userinfo drop constraint new_pk_id;
Oracle学习笔记(4)——约束_第8张图片
  • 方法三:彻底删除约束 
    • DROP PRIMARY KEY[CASCADE]
    说明:我们每一张表当中只有一个主键约束,因此我们在删除的时候,直接写主键约束这个关键字,就可以自动的将表中的主键约束去掉。CASCADE:用于级联的删除。如果两个表之间存在着外键约束的关系,我们使用CASCADE,这样的话,就可以把其它表引用我们这个字段的地方的约束删掉。
                                      例如:alter table userinfo_p drop primary key;

  • 外键约束:
            外键约束是唯一一个涉及两个表当中字段关系的约束。
  • 在创建表时设置外键约束
    • 方法一:CREATE TABLE table (column_name datatype REFERENCES table2(column_name),...);
                         例如:
                          1、先创建主表
                           create table typeinfo
                           (
                               typeid varchar2(10) primary key,
                               typename varchar2(20)
                           );
                          2、再创建从表
                           create table userinfo_f
                           (
                               id varchar2(10) primary key,
                               username varchar2(20),
                               typeid_new varchar2(10) references typeinfo(typeid)
                           );
                           设置完成,我们测试一下:
                           insert into typeinfo values(1,1);
                           insert into userinfo_f(id,typeid_new) values(1,2);报错
                           insert into userinfo_f(id,typeid_new) values(1,1);
                           insert into userinfo_f(id,typeid_new) values(1,null);
Oracle学习笔记(4)——约束_第9张图片
Oracle学习笔记(4)——约束_第10张图片
  • 方法二:CONSTRAINT constraint_name FOREIGN KEY(column_name) 
                                            REFERENCES table_name(column_name)[ON DELETE CASCADE];
                                            说明:ON DELETE CASCADE级联删除。主表当中的一条数据删除后,从表当中使用
                                                      了这条数据字段所在行也会被一起删除,这样的话,就确保了主从表数据的完整性。
                           例如:
                           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)
                            );

                                            
                          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) not delete cascade
                            );

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

                          alter table userinfo_f4 add constraint fk_typeid_alter foreign key(typeid_new) references typeinfo(typeid);
  • 删除外键约束
    • 禁用外键约束:DISABLE | ENABLE CONSTRAINT constraint_name
                               例如:
                                select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_F4';
                                  
                                alter table userinfo_f4 diable constraint FK_TYPE_ALTER;
  • 彻底删除外键约束:DROP CONSTRAINT constraint_name;
                              例如: alter table userinfo_f4 drop constraint FK_TYPE_ALTER; 
  • 唯一约束:
    • 作用:保证字段的唯一性。
    • 唯一约束和主键约束的区别:主键字段值必须是非空的。唯一约束允许有一个空值。主键在每一张表中只能有一个。唯一约束在每张表中可以有多个。
    • 在创建表时设置唯一约束
      • 方法一:CREATE TABLE table_name(column_name datatype UNIQUE,...);
                                例如:
                                create table userinfo_u
                                (
                                    id varchar2(10) primary key,
                                    username varchar2(10) unique,
                                    userpwd varchar2(10)
                                );
  • 方法二:CONSTRAINT constraint_name UNQIUE(column_name);
                                 例如:
                                   create table userinfo_u1
                                    (
                                            id varchar2(10) primary key,
                                            username varchar2(20),
                                            constraint un_username unique(username)
                                     );
                                   
  • 在修改表时添加唯一约束
    • ADD CONSTRAINT constraint_name UNIQUE(column_name);
                              例如:
                                create table userinfo_u2
                                (
                                        id varchar2(10) primary kry,
                                        username varchar2(20)
                                );
                                
                                alter table userinfo_u2 add constraint un_username_new unique(username);
    • 删除唯一约束
      • DISABLE | ENABLE CONSTRAINT constraint_name;
      • DROP CONSTRAINT constraint_name;
  • 检查约束:
    • 作用:表中的值更具有实际意义
    • 在创建表时设置检查约束
      • 方法一:CREATE TABLE table_name(column_name datatype CHECK(expressions),...);
                           例如:
                               create table userinfo_c
                                (
                                        id varchar2(10) primary key,
                                        username varchar2(20),
                                        salary number(5,0) check(salary>0)
                                );
                                insert into userinfo_c values(1,'aaa',-50);报错,违反了检查约束。
  • 方法二:CONSTRAINT constraint_name CHECK(expressions);
                                例如:
                               create table userinfo_c1
                                (
                                        id varchar2(10) primary key,
                                        username varchar2(20),
                                        salary number(5,0);
                                        constraint ck_salary check(salary>0)
                                );

  • 在修改表时添加检查约束
    • ADD CONSTRAINT constraint_name CHECK(expressions);
                            例如:
                             create table userinfo_c3
                              (
                                    id varchar2(10) primary key,
                                    username varchar2(20),
                                    salary number(5,0)
                               );
                                alter table userinfo_c3 add constraint ck_salary_new check(salary>0);
    • 删除检查约束
      • DISABLE | ENABLE CONSTRAINT constraint_name;
      • DROP CONSTRAINT constraint_name;
  • 总结:
    • 在创建表时设置约束。
      • 非空约束只能在列级设置,不能再表级设置。其他约束即可在列级设置也可以在表级设置。
    • 更改约束的名称。
      • 数据字典(user_constraints)
      • RENAME CONSTRAINT old_name TO new_name;

你可能感兴趣的:(oracle)