• 数据约束


    因为工作关系,需要详细掌握Oracle系统中的几种约束

    ----当前user中有哪些约束  
    SELECT distinct constraint_type FROM USER_CONSTRAINTS;
    --C:  Check ,On Table  
    --O:  Read Only, On View
    --P:  Primary Key 
    --R:  FK(Foreign Key, Referential Integrity)
    --U:  Unique Key
    --V:  Check Option, On View
    ------------下面三个听说过没见过
    ---H Hash expression ---F Constraint that involves a REF column ---S Supplemental logging

    1. Check
    确保指定列中的值符合一定条件。check约束可以涉及该行的同属于check约束的其他数据列,但是不能涉及其他行或者其他表。

    单一的数据列可以有多个check保护,一个check约束可以保护多个数据列。

    可以在create table时创建check约束,也可以在alter table时修改表的约束。

    其语句格式为 constraint [约束名] check(codition). 约束名不是必须的,但是最好有一个名字。

    create table t_ygy_demo_editor
    (
      editor_key              varchar2(9) not null,
      editor_last_name       varchar2(40),
      editor_first_name      varchar2(30) not null,
      editor_hire_date       date,
      editor_active          char(1) 
      constraint active_ck check (editor_active in ('Y','N'))
    );
    
    alter table 表名 add constraint chka1 check(a1 in (1,0));
    alter table 表名 disable/enable/drop constraint chka1;

    示例:

    ALTER TABLE       T_YGY_DEMO_A
    ADD CONSTRAINT C_2 CHECK (A_ID > 5); 

    2. Not Null

    它作用在单一数据列上,保证数据列必须要有数据值。当not null是在alter table时才添加上时,写法有所不同:

    create table 表名
    (
    a1 int not null,
    a2 int
    )
    alter table 表名 modify a2 not null

    3. Primary Key

    是表中的一列或者多列,决定表中每个行的唯一性,主键列必须是not null。如果是复合主键,要放入括号中。比如:

    create table 表名
    (
    stuid int,
    courseid int,
    primary key(列名1, 列名2, ......),
    score float
    )
     
    alter table 表名 add constraint 主键名 primary key (列名s)
    alter table 表名 drop/disable/enable primary key(或者用名字); 
    ------------------------------------------
    -----创建测试用的表
    create table test22
    (
    sno char(12),
    name char(4)
    );
    -----添加联合主键
    alter table test22 add constraint PK_TAB2 primary key (sno,name);
    ---查询这个主键
    select * from user_constraints t where t.constraint_name='PK_TAB2';
    SELECT * FROM user_cons_columns T WHERE T.constraint_name='PK_TAB2';

    4. Unique

    保证那些具有惟一性但又不是主键的一部分列的唯一性。可以保护多个列,唯一性约束与表一起创建,可以用alter table语句修改它:

    create table 表名
    ( a1 int unique,
    a2 int)
    alter table 表名 add constraint 约束名 unique(列名s)
    alter table 表名 disable /enable/ drop constraint 约束名

    不能删除带有外键指向的表的唯一性约束,除非先禁用或者删除了外键。删除或者禁用唯一性约束通常会同时删除相关联的唯一索引,降低性能,

     

    要避免这种情况,可以在唯一性约束保护的数据列上先创建非唯一性索引,再添加唯一性约束。

    5. Foreign Key

    create table a               create table b
    (                                   (
    a1 int primary key,       b1 int primary key,
    a2 int not null,              b2 int not null,
    a3 int unique                )
    )
     
    create table c
    (
    ca int,
    cb int,
    primary key(ca, cb),
    constraint 外键名1 foreignkey(本表列1) references 其他表(其他表中对应列),
    constraint 外键名2 foreignkey(本表列2) references 其他表(其他表中对应列)
    )
    alter table 表名 add constraint 外键名 foreign key(本表列名) references 其他表(其他表中对应列);
    alter table 表名 disable/enable/drop constraint 外键名
    

     

    http://docs.oracle.com/cd/B28359_01/server.111/b28286/clauses002.htm

    http://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_1044.htm#REFRN20047

     抄来一个综合案例

    综合案例:

    商品售货系统表设计案例

    现在有一个商店的数据库,记录客户及其购物情况,由下面三个表组成:

    商品表Goods(商品号GoodsId,商品名GoodName,单价UnitPrice,商品类别Categroy,供应商Provider)

    客户表Customers(客户号CustomerId,姓名Name,住址Address,电邮Email,性别Gender,身份证CardId)

    销售表Purchases(客户号CustomerId,商品号GoodsId,购买数量Num)

    请用SQL语言完成下列功能:

    建表,在定义中要求声明:

    (1)每个表的主外键。

    (2)客户的姓名不能为空值。

    (3)单价必须大于0,购买数量必须在1~30之间。

    (4)电邮不能够重复。

    (5)客户的性别必须是男或女,默认是男。

    create table Goods(
    
    GoodsId char(8) primary key ,--主键
    
    GoodName varchar2(50),
    
    UnitPrice number(10,2) check(UnitPrice>0),--单价必须大于0
    
    Category varchar(30),
    
    Provider varchar(100));
    
    sql>create table Customers(
    
    CustomerId char(8) primary key,
    
    Name varchar2(30) not null, --姓名不能为空
    
    Address varchar2(150),
    
    Email varchar2(100) unique,--必须唯一
    
    Gender char(2) default('') check(Gender in('','')),
    
    CardId char(18));
    
    sql>create table Purchases(
    
    CustomerId char(8) references Customers(CustomerId), --外键
    
    GoodsId char(8) references Goods(GoodsId),
    
    Num number(10) check(Num between 1 and 30)));

    2、添加约束

    如果在建表时忘记建立必要的约束,则可以在建表后使用alter table命令为表增加约束,但是要注意:增加not null约束时,需要使用modify选项,而增加其他四种约束使用add选项。

    (1)增加商品名也不能为空

    alter table Goods modify GoodsId not null;

    (2)增加身份证也不能重复

    alter table Customers add constraint UQ_CardId unique(CardId);

    (3)增加客户的住址只能是海淀、朝阳、东城、西域

    alter table Customers add constraint CK_Address check(Address in ('海淀','朝阳','东城','西域')); 

    3、删除约束

    当不再需要某个约束时,可以删除。

    alter table 表名 drop constraint 约束名称;

    特别说明:

    在删除主键约束的时候,可能有错误。比如

    alter table 表名 drop primary key;

    这是因为如果在两表存在主从关系,那么在删除主表主键约束时,必须带上cascade选项。

    alter table 表名 drop primary key cascade;

    4、显示约束信息

    A、显示约束信息

    通过查询数据字典视图user_constraints,可以显示当前用户所有的约束的信息。

    select constraint_name,constraint_type,status,validated from user_constraints where table_name='Goods';

    B、显示列约束

    通过查询数据字典视图user_cons_column,可以显示约束所对应的表列信息。

    select column_name,position from user_cons_columns where constraint_name='CK_Address';

    6、表级定义和列级定义

    A、表级定义

    表级定义是指在定义了所有列后,再定义约束,这里需要注意,not null约束只能在列级上定义。

    案例:

     create table Goods(
    
    GoodsId char(8),GoodsName varchar2(50), Category varchar(30),
    
    constraint PK_GoodsId primary key(GoodsId));

    B、列级定义

    列级定义是在定义列的同时定义约束。

    案例:

    create table Goods(
    
    GoodsId char(8) constraint PK_GoodsId primary key ,--主键
    
    GoodName varchar2(50),
    
    UnitPrice number(10,2) check(UnitPrice>0),--单价必须大于0
    
    Category varchar(30),
    
    Provider varchar(100));
  • 相关阅读:
    jquery UI_tabs
    乔布斯传
    微信小程序
    天气预报相关参数
    ASP.NET MVC TempData使用心得
    jquery.restrictFieldLength.js
    join Linq
    SQL_关联映射
    介绍几个好用的vs插件
    DependencyResolver.Current
  • 原文地址:https://www.cnblogs.com/adamgq/p/12222414.html
Copyright © 2020-2023  润新知