zoukankan      html  css  js  c++  java
  • Oracle学习笔记(四)

    六、约束
    1、约束的作用
    定义规则:什么数据可以输入,什么不可以
    确保完整性:数据的精确性和可靠性
    2、Oracle五个重要的约束:
    非空约束、主键约束、外键约束、检查约束、唯一约束。
    (1)非空约束
    (a)在创建表的时候设置非空约束
    例子:
    create table usr_a(
    user_id number(30) not null,
    user_name varchar2(20) not null
    );
    desc usr_a ------看到表格是否为空选项为not null

    insert into usr_a(id) values(1); -------非空的未插入值会报错
    (b)在修改表时添加非空约束
    例子:
    alter table userinfo modify user_a_id number(30) not null;-----表中有数据,需要删除表中数据,delete from useinfo;
    (c)在修改表时,去除非空约束
    alter table userinfo modify user_a_id number(30) null;
    (2)主键约束
    作用:确保表中每一行数据的唯一性
    说明:
    1、一张表只能设计一个主键约束
    2、主键约束可以由多个字段构成(联合主键或复合主键)
    (a)在创建表时设置主键约束
    方法一:(设置主键约束就相当于为其加上了非空约束)
    create table usr_p(
    user_id number(6,0) primary key,
    user_name varchar2(20)
    );
    方法二(创建联合主键):
    create table usr_c(
    user_id number(30),
    user_name varchar2(20),
    user_pwd varchar2(20),
    constraint pk_id_username primary key(user_id,user_name)
    );

    忘记主键查找的方法
    desc user_constraints ---查看数据字典
    select constraint_name from user_constraints where table_name='USR_C1';
    查看未设置主键约束的表,系统附加主键
    select constraint_name from user_constraints where table_name='USR_P';

    (b)在修改表时添加主键约束(表中没有数据)
    alter table user_info add constraint pk_user_a_id primary key(user_a_id);
    desc user_constraints
    select constraint_name from user_constraints where table_name='USER_INFO';
    (c)更改约束的名称
    alter table user_info rename constraint pk_user_a_id to new_pk_id;
    (d)删除主键约束
    禁用约束
    alter table user_info disable constraint new_pk_id;
    解开禁用
    alter table user_info enable constraint new_pk_id;
    查看状态
    desc user_constraints
    select constraint_name,status from user_constraints where table_name='USER_INFO';

    删除约束
    方法一:
    alter table user_info drop constraint new_pk_id;
    方法二:
    alter table user_info drop primary key;
    (3)外键约束
    说明:唯一一个设计两个表之间关系的约束
    (a)在创建表时添加外键约束(列级)
    从表中外键字段的值必须来自主表中的相应字段的值,或者为null值
    (例一)在用户信息表当中,有一个用户类型字段,将类型字段设置成一个外键约束,用它来引用用户类型表当中的用户编号字段
    创建主表 ,用户类型表
    create table typeinfo(
    typeid varchar2(10) primary key,
    typename varchar2(20)
    );
    创建从表,用户信息表
    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);
    从表出入数据(从表的外键插入数据要么是主表的值,要么是null,不可以是其他值,比如insert into userinfo_f(id,typeid_new) values(3,2)(在主表只有(1,1)数据时就是错误的))
    insert into userinfo_f(id,typeid_new) values(1,1);
    insert into userinfo_f(id,typeid_new) values(2,null);

    (b)在创建表时设置外键约束
    级联删除
    删除从表的字段,主表的对应字段也会被删除
    此表建成后,插入数据,关联的表typeinfo,就会跟新,但是typeinfo中的数据无法删除
    create table userinfo_f2(
    id varchar2(10) primary key,
    username varchar2(20),
    typeid_new varchar2(10),
    constraint fk_typeid foreign key(typeid_new) references typeinfo(typeid)
    );

    级联删除(外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除)
    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) on delete cascade
    );
    (c)在修改表时添加/删除外键约束
    create table userinfo_f3(
    id varchar2(10) primary key,
    username varchar2(20),
    typeid_new varchar2(10)
    );
    添加外键约束
    alter table userinfo_f3 add constraint fk_typeid_alter foreign key(typeid_new) references typeinfo(typeid);
    添加级联外键约束
    alter table userinfo_f3 add constraint fk_typeid_alter foreign key(typeid_new) references typeinfo(typeid) on delete cascade;
    删除外键约束
    禁用删除
    alter table userinfo_f3 disable constraint fk_typeid_alter;
    启用
    alter table userinfo_f3 enable constraint fk_typeid_alter;
    查看
    select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_F3';
    表格中缩写P主键约束,R外键约束,C约束的意思

    彻底删除约束
    alter table userinfo_f3 drop constraint fk_typeid_alter;

    (4)唯一约束
    设置唯一约束的值需要保证值的唯一性.比如类似的主键需要唯一性.
    唯一约束和主键约束的区别:
    (1)主键字段值必须是非空的
    (2)唯一约束可以在每张表用有多个,主键只能一个. 唯一约束包含主键约束
    (a)在创建表时设置唯一约束
    列级(单独一个列设置)
    create table userinfo_f4(
    id varchar2(10) primary key,
    username varchar2(20) unique,
    userpwd varchar2(10)
    );
    表级(整个表设置)
    create table userinfo_f5(
    id varchar2(10) primary key,
    username varchar2(20),
    constraint un_username unique(username),
    userpwd varchar2(10)
    );
    (b)在修改表时添加唯一约束
    alter table userinfo_f5 add constraint un_userpwd unique(userpwd);
    (c)删除唯一约束
    禁用删除
    alter table userinfo_f5 disable constraint UN_USERPWD;
    启用
    alter table userinfo_f5 enable constraint UN_USERPWD;
    查看
    select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_F5';
    彻底删除约束
    alter table userinfo_f5 drop constraint UN_USERPWD;

    (5)检查约束
    作用:表中的值更具有实际意义(核查有没有不合理的数据,比如工资是负值)

    a、在创建表时设置检查约束
    列级约束
    create table userinfo_f6(
    id varchar2(10) primary key,
    username varchar2(20) ,
    salary number(5,0) check(salary>0),
    userpwd varchar2(10)
    );
    测试数据
    insert into userinfo_f6 values(1,'xx',-50,'1234');
    表级(整个表设置)
    create table userinfo_f7(
    id varchar2(10) primary key,
    username varchar2(20) ,
    salary number(5,0),
    constraint ck_salary check(salary>0),
    userpwd varchar2(10)
    );
    测试数据
    insert into userinfo_f7 values(1,'xx',-50,'1234');
    b、在修改表时添加检查约束
    alter table userinfo_f7 add constraint ck_userpwd_new check(userpwd>'1');
    测试数据
    insert into userinfo_f7 values(1,'xx',50,'0');
    c、删除检查约束
    禁用删除
    alter table userinfo_f7 disable constraint CK_USERPWD;
    启用
    alter table userinfo_f7 enable constraint CK_USERPWD;
    查看
    select constraint_name,constraint_type,status from user_constraints where table_name='USERINFO_F7';
    彻底删除约束
    alter table userinfo_f7 drop constraint CK_USERPWD_NEW;

    总结:
    1、在创建表时设置约束,非空约束只能在列级约束,不能在表级约束.非空约束是没有名字
    2、在修改表时添加约束,非空约束直接加在最后即可。
    3、更改约束,非空无法改,因为没有名字
    4、删除约束时,非空改为空即可

  • 相关阅读:
    LightOJ 1203--Guarding Bananas(二维凸包+内角计算)
    断言assert()与调试帮助
    POJ 3528--Ultimate Weapon(三维凸包)
    POJ 2208--Pyramids(欧拉四面体体积计算)
    HDU 1411--校庆神秘建筑(欧拉四面体体积计算)
    HDU 1241 DFS
    HDU 2037(贪心)
    一次傻乎乎的错误QAQ
    封装Qt的SQLite接口类
    最小生成树(Kruskal算法)模板
  • 原文地址:https://www.cnblogs.com/liuyangfirst/p/6416506.html
Copyright © 2011-2022 走看看