精华内容
下载资源
问答
  • 数据库完整性约束基础语句,包含对某些属性的特定取值,定义默认对象,定义和绑定规则,创建级联。文档包含代码和截图,方便查看
  • 数据完整性是指数据的正确性、完备性和一致性,是衡量数据库质量...数据库完整性由各式各样的完整性约束来确保,因而可以说数据库完整性规划即是数据库完整性约束的规划。那么,数据库设计的完整性约束表现哪些方面?
  • (本次实验难点是完整性约束,特别是参照完整性约束(主外键)!应注意对完整性约束作验证,关键给出违反约束的验证,要说明理由)
  • MySQL数据库全套视频,带你了解MySQL数据库,免费领取Python自动化学习资料 工具,面试宝典面试技巧
  • 本文实例讲述了mysql完整性约束。分享给大家供大家参考,具体如下: 主要内容 not null 与 default unique primary auto_increment foreign key 约束条件作用:用于保证数据的完整性和一致性 主要分为 PRIMARY...
  • #五种完整性约束: #NOT NULL :非空约束,指定某列不能为空; #UNIQUE : 唯一约束,指定某列或者几列组合不能重复 #PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录 #FOREIGN KEY :外键,指定该行记录从...
  • 完整性约束  完整性约束是为了表的数据的正确性!如果数据不正确,那么一开始不能添加到表中。  主键  当某一列添加了主键约束后,那么这一列的数据不能重复出现。这样每行记录中其主键列的值是这一行的标识。...
  • 主要介绍了数据库中的sql完整性约束语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了sqlserver中数据库的完整性约束使用方法,需要的朋友可以参考下
  • SQL语句——完整性约束

    千次阅读 2021-01-28 07:00:23
    1.MySQL支持的完整性约束a.主键约束特点:唯一且非空主键可以由一个字段组成,也可以由多个字段组成如果主键由一个字段组成,既可以添加到列级,也可以添加到表级。如果主键由多个字段组成,则只能添加到表级。(1)在...

    1.MySQL支持的完整性约束

    IbueQj.jpg

    IbueQj.jpg

    a.主键约束

    特点:唯一且非空

    主键可以由一个字段组成,也可以由多个字段组成

    如果主键由一个字段组成,既可以添加到列级,也可以添加到表级。

    如果主键由多个字段组成,则只能添加到表级。

    (1)在字段的列级添加约束

    create table 表名(

    字段名 字段类型 primary key

    )

    create table student_1(

    id varchar(10) primary key,

    name varchar(15),

    age int(2),

    sex varchar(1)

    )

    desc student_1

    (2)表级上添加主键约束

    creat tabel 表名 (

    字段名1,字段类型1,

    字段名2,字段类型2,

    ……

    字段名n, 字段类型n,

    [constraint 主键约束名] primary key(字段名)

    )

    create table student_2(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1),

    constraint pk_student_2 primary key(id)

    )

    -- 查看表结构

    desc student_2

    (3)多个字段作为组件,只能添加到表级

    creat table 表名(

    字段名1,字段类型1,

    字段名2,字段类型2,

    ……

    字段名n,字段类型n,

    [constraint 主键约束名] primary key(字段名1,字段名2…)

    )

    create table student_3(

    id int(8),

    name varchar(20),

    school varchar(10),

    age int(2),

    sex varchar(1),

    constraint pk_student_3 primary key(school,id)

    )

    -- 查看表结构

    desc student_3

    (4)给已有表添加主键

    语法:alter table 表名 add[constraint 主键约束名] primary key(字段名)

    create table student_4(

    id int(8),

    name varchar(20),

    school varchar(10),

    age int(2),

    sex varchar(1)

    )

    alter table student_4 add constraint pk_student_4 primary key(id)

    -- 查看表结构

    desc student_4

    (5)删除主键约束

    语法:alter table 表名 drop primary key;

    alter table student_4 drop primary key

    b.唯一约束 unique

    指:表中字段的值不能重复

    (1)列级添加唯一约束,语法:

    creat tabel 表名 (

    字段名1,字段类型1 unique,

    字段名2,字段类型2,

    ……

    字段名n, 字段类型n

    )

    create table student_5(

    id int(8),

    name varchar(20) unique,

    school varchar(10),

    age int(2),

    sex varchar(1)

    )

    -- 查看表结构

    desc student_5

    (2)表级添加唯一约束:

    creat table 表名(

    字段名1,字段类型1,

    字段名2,字段类型2,

    ……

    字段名n,字段类型n,

    [constraint 唯一约束名] unique (字段名1,字段名2…)

    )

    create table student_6(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1),

    constraint uk_student_6_id_name unique(id,name)

    )

    (3)给已有表添加唯一约束

    alter table 表名 add [constraint 唯一约束名] unique (字段名1,字段名2…)

    create table student_7(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1)

    )

    alter table student_7 add constraint uk_student_7_name unique(name)

    -- 查看表结构

    desc student_7

    (4)删除唯一约束

    语法:

    alter table 表名 drop index 唯一约束名

    注意:如果单个字段没有指定唯一约束名,则默认的唯一约束名为字段名

    create table student_7(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1)

    )

    alter table student_7 add unique(name)

    alter table student_7 drop index name

    -- 查看表结构

    desc student_7

    如果是多个字段组合为唯一约束时候,默认的唯一约束名为第一个字段的名称

    如果指定了约束名,则删除的时候写约束名

    create table student_7(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1)

    )

    alter table student_7 add constraint uk_student_7_name unique(name)

    alter table student_7 drop index uk_student_7_name

    c.非空约束

    某张表中某字段的值不能为空

    注意:1.只能使用列级添加

    2.空字符串“ ” 或者0都不是null

    (1)列级添加非空约束

    creat table 表名(

    字段名 字段类型 not null

    )

    create table student_8(

    id int(8) not null,

    name varchar(20),

    age int(2),

    sex varchar(1)

    )

    -- 查看表结构

    desc student_8

    (2)给已有表添加非空约束

    alter table 表名 modify 字段名 字段类型 not null

    create table student_9(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1)

    )

    alter table student_9 modify name varchar(20) not null

    -- 查看表结构

    desc student_9

    (3)删除非空约束

    alter table 表名 modify 字段名 字段类型 [null]

    alter table student_9 modify name varchar(20)

    [ ]内的内容可写可不写

    d.默认值约束(default)

    指在没有对某字段插入具体值的时候,会默认的值

    注意:1.只能使用列级约束

    2.对于使用默认值约束,如果插入的数据为“null”,则不会使用默认值,只有没有插入数据时候,才会使用默认值。

    (1)列级添加默认追约束

    语法:creat table 表名 (

    字段名 字段类型 default value

    )

    create table student_10(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1) default '男'

    )

    -- 查看表结构

    desc student_10

    (2)给已有表添加默认值约束

    alter table 表名 modify 字段名 字段类型 default value

    create table student_11(

    id int(8),

    name varchar(20),

    age int(2),

    sex varchar(1)

    )

    alter table student_11 modify sex varchar(1) default '男'

    -- 查看表结构

    desc student_11

    (3)删除默认值约束

    alter table 表名 modify 字段名 字段类型

    alter table student_11 modify sex varchar(1)

    e.自动增长约束(auto_increment)

    指:表中某字段的值会自动增加

    注意:1.一张表中只能有一个自动增长的字段

    2.配合主键一起使用,并且只适用于整数类型

    3.自动增长默认的初始值1,每增加一条记录,该字段的值会增加1.

    (1)创建表的时候创建自动增长约束

    create table 表名(

    字段名 字段类型 auto_increment

    )

    create table student_12(

    id int(8) PRIMARY KEY auto_increment,

    name varchar(20) ,

    age int(2),

    sex varchar(1)

    )

    (2)给已有表添加自动增长约束

    alter table 表名 modify 字段名 字段类型 auto_increment

    create table student_13(

    id int(8)PRIMARY KEY,

    name varchar(20) ,

    age int(2),

    sex varchar(1)

    )

    alter table student_13 modify id int(8) auto_increment

    -- 查看表结构

    desc student_13

    (3)删除自动增长约束

    语法:alter table 表名 modify 字段名 字段类型

    alter table student_13 modify

    f.外键约束(foreign key)

    外键:某一表中某字段的值依赖于另一张表中某字段的值

    如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系模式R1的外键。

    作用:主要实现了数据库中的参照完整性

    将两张表紧密结合,对某张表修改或者删除时候,要保证数据的完整

    例如:班级(t_class)学生(t_student)关系:1-n (一对多)

    (1)创建外键约束

    注意:虽然MySQL提供了列级添加外键约束,但添加完后不会生效,所以使用表级添加外键约束。

    语法:create table 表名(

    字段名,字段类型

    [constraint 外键约束名] foreign key(字段名) references 表(字段名)

    )

    create TABLE t_class(

    cno INT(8) PRIMARY KEY auto_increment,

    cname VARCHAR(20)

    )

    create TABLE t_student(

    son INT(8) PRIMARY KEY auto_increment,

    sname VARCHAR(20),

    age INT(2),

    sex VARCHAR(2),

    stu_con INT(8),

    CONSTRAINT fk_t_student_stu_con FOREIGN KEY(stu_con) REFERENCES t_class(cno)

    )

    (2)在已有表中添加外键约束

    语法:alter table 表名 add [constraint 外键约束名] foreign key(字段名) references 表(字段名)

    例如:班级(tt_class)学生(tt_student)

    --创建班级表(tt_class)

    create TABLE tt_class(

    cno INT(8) PRIMARY KEY auto_increment,

    cname VARCHAR(20)

    )

    --创建学生表(tt_student)

    create TABLE tt_student(

    son INT(8) PRIMARY KEY auto_increment,

    sname VARCHAR(20),

    stu_cno INT(8)

    )

    --给tt_student表添加外键约束

    alter table tt_student add CONSTRAINT fk_tt_student_stu_cno FOREIGN KEY (stu_cno) REFERENCES tt_class(cno)

    desc tt_class

    desc tt_student

    (3)删除外键约束

    alter table 表名 drop foreign key 外键约束名

    --删除外键约束名

    alter table tt_student drop foreign key fk_tt_student_stu_cno

    (4)有关系的表进行删除

    (1)以公共关键字作主键的表为主键表(父表,主表)

    (2)以公共关键字作外键的表为外键表(从表,外表)

    a.先删除有外键约束的表(从表),再删除主表

    会报错:

    t_student t_class

    drop table t_class;

    [SQL] drop table t_class;

    [Err] 3730 - Cannot drop table 't_class' referenced by a foreign key constraint 'fk_t_student_stu_con' on table 't_student'.

    应该:

    drop table t_student;

    drop table t_class;

    b.先删除外键约束,再删除表

    alter table t_student drop FOREIGN KEY fk_t_student_stu_con

    drop table t_class

    drop table t_student

    展开全文
  • 2017-06-18 回答多个表之间有参照完整性约束. check 一般是检查自己这个表的 约束, 例如 什么性别只能是 0/1, 年龄不能大于 100 之类的检查. 多表参照, 一般是使用 外键约束来实现的: 例如: -- 创建测试主表. id 是...

    2017-06-18 回答

    多个表之间有参照完整性约束. check 一般是检查自己这个表的 约束, 例如 什么性别只能是 0/1, 年龄不能大于 100 之类的检查. 多表参照, 一般是使用 外键约束来实现的: 例如: -- 创建测试主表. id 是主键. create table test_main ( id int not null, value varchar(10), primary key(id) ); -- 创建测试子表. create table test_sub ( id int not null, main_id int , value varchar(10), primary key(id) ); -- 插入测试主表数据. insert into test_main(id, value) values (1, 'one'); insert into test_main(id, value) values (2, 'two'); -- 插入测试子表数据. insert into test_sub(id, main_id, value) values (1, 1, 'oneone'); insert into test_sub(id, main_id, value) values (2, 2, 'twotwo'); sql> -- 创建外键(默认选项) sql> alter table test_sub add constraint main_id_cons foreign key (main_id) references test_main; table altered. sql> sql> -- 测试删除主表数据. 将出错 ora-02292: 违反完整约束条件 sql> delete 2 test_main ...多个表之间有参照完整性约束. check 一般是检查自己这个表的 约束, 例如 什么性别只能是 0/1, 年龄不能大于 100 之类的检查. 多表参照, 一般是使用 外键约束来实现的: 例如: -- 创建测试主表. id 是主键. create table test_main ( id int not null, value varchar(10), primary key(id) ); -- 创建测试子表. create table test_sub ( id int not null, main_id int , value varchar(10), primary key(id) ); -- 插入测试主表数据. insert into test_main(id, value) values (1, 'one'); insert into test_main(id, value) values (2, 'two'); -- 插入测试子表数据. insert into test_sub(id, main_id, value) values (1, 1, 'oneone'); insert into test_sub(id, main_id, value) values (2, 2, 'twotwo'); sql> -- 创建外键(默认选项) sql> alter table test_sub add constraint main_id_cons foreign key (main_id) references test_main; table altered. sql> sql> -- 测试删除主表数据. 将出错 ora-02292: 违反完整约束条件 sql> delete 2 test_main 3 where 4 id = 1; delete * error at line 1: ora-02292: integrity constraint (hr.main_id_cons) violated - child record found

    展开全文
  • sql完整性约束有哪些

    千次阅读 2021-01-18 21:24:05
    sql完整性约束有:1、“NOT NULL”非空约束,指定的列不允许为空值;2、“UNIQUE”唯一约束,指定列中没有重复值;3、“PRIMARY KEY”主键约束,唯一的标识出表的每一行;4、“FOREIGN KEY”外键约束;5、“CHECK”...

    sql完整性约束有:1、“NOT NULL”非空约束,指定的列不允许为空值;2、“UNIQUE”唯一约束,指定列中没有重复值;3、“PRIMARY KEY”主键约束,唯一的标识出表的每一行;4、“FOREIGN KEY”外键约束;5、“CHECK”条件约束。

    81e3d3630043e29d730af102325c3c44.png

    完整性约束是保证用户所做的修改不会破坏数据的一致性,是保护数据正确性和相容性的一种手段。

    常见的5种约束:

    NOT NULL:非空约束C,指定的列不允许为空值

    UNIQUE:唯一约束U,指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的

    PRIMARY KEY:主键约束P,唯一的标识出表的每一行,且不允许空值,一个表只能有一个主键约束

    FOREIGN KEY:外键约束R,一个表中的列引用了其它表中的列,使得存在依赖关系,可以指向引用自身的列

    CHECK:条件约束C,指定该列是否满足某个条件

    非空约束 NKcreate table member(

    mid number,

    name varchar2(200) not null

    );

    插入空报错:SQL> insert into member(mid,name) values(1,null);

    *

    第 1 行出现错误:

    展开全文
  • 违反完整性约束的解决办法2) 执行上面(1)的存储过程 (3)使用dom命令连接数据库,然后执行下面的语句
  • 完整性约束

    万次阅读 2016-11-15 21:43:28
    数据完整性简介业务规则会指定一些条件和关系,它们要么必须始终为真,要么必须始终为假。例如,每个公司会定义其有关工资、 雇员人数、 库存跟踪,等方面的政策。保持数据的数据完整性很重要,它由数据库管理员或...

    数据完整性简介

    业务规则会指定一些条件和关系,它们要么必须始终为真,要么必须始终为假。例如,每个公司会定义其有关工资、 雇员人数、 库存跟踪,等方面的政策。保持数据的数据完整性很重要,它由数据库管理员或应用程序开发人员来确定,以遵从业务规则。

    用于保证数据完整性的技术

    在设计数据库应用程序时,开发人员有多种选项用于保证存储在数据库中的数据的完整性。这些选项包括:

     通过数据库触发器存储过程,强制实施业务规则

     使用存储过程完全控制数据访问

     在数据库应用程序的代码中执行业务规则

     使用Oracle完整性约束,它们是定义在列级或对象级上的,用来限制数据库中的值的规则

    完整性约束的优势

    完整性约束是一个模式对象,它使用 SQL来创建和删除。若要强制实施数据完整性,请尽可能使用完整性约束。相对于其他强制数据完整性替代方案,完整性约束包括如下优点:

     容易声明

    在您定义或更改表时,使用 SQL 语句定义完整性约束,而无需任何额外的编程。SQL 语句易于编写,也易于排除编程错误。

     集中化的规则

    完整性约束定义在表上,并存储在数据字典中 。因此,由所有应用程序输入的数据都必须遵守相同的完整性约束。如果约束规则在表级发生了更改,应用程序不需要变更。此外,甚至在数据库检查 SQL 语句之前,应用程序就可以使用数据字典中的元数据立即告知用户的违例行为。

     加载数据时的灵活性

    当加载大量数据时,您可以暂时禁用完整性约束,以避免性能开销。当数据加载完成后,您可以重新启用完整性约束。

    完整性约束的类型

    Oracle 数据库使您能够在表级列级应用约束。作为列或属性定义的一部分而指定的约束,称为行内规范约束。作为表定义的一部分而指定的约束称为行外规范约束

    好几种类型的完整性约束定义中都使用键这个术语。键是某种类型的完整性约束的定义中包含的列或列集。键描述关系数据库中的表与列之间的关系。键中的单个值称为键值。

    表 5-1 描述了约束的类型。除NOT NULL必须指定为行内规范,其它每一个都可以指定为行内或行外规范。

    这里写图片描述
    这里写图片描述

    非空完整性约束

    NOT NULL 约束要求表中的列不包含空值。空值即值的缺失。默认情况下,一个表中的所有列都允许空值

    关于default 和 not null 和 default default_value not null:

    create table test (col1 number default 0, col2 number constraint nn_col2  not null, col3 number);
    
    alter table test modify col3  default 0 constraint nn_col1 not null;
    
    --再往表中插入值时,如果不显式指定col2列的值,会提示错误:
    SQL> insert into test(col1, col3) values (1, 1);
    insert into test(col1, col3) values (1, 1)
    *
    ERROR at line 1:
    ORA-01400: cannot insert NULL into ("HR"."TEST"."COL2")
    
    --如果只指定了col2列的值,col1,col3列使用默认值:
    SQL> insert into test (col2) values (1);
    
    1 row created.
    
    SQL> select * from test;
    
          COL1   COL2       COL3
    ---------- ---------- ----------
         0      1          0
    
    --由于col3列有not null完整性约束,不允许空值:
    SQL> insert into test (col1, col2, col3) values ('', 1, '');
    insert into test (col1, col2, col3) values ('', 1, '')
                                                       *
    ERROR at line 1:
    ORA-01400: cannot insert NULL into ("HR"."TEST"."COL3")

    not null 与 default default_value not null主要区别在于:
    虽然它们都不允许空值插入,但如果没有显式指定列值的话:default default_value not null 列可以插入默认值,而由于not null 只能插入空值,所以不允许插入。

    唯一键约束

    唯一键约束要求在一个列或列集中的每个值是唯一的。在一个表中,不允许多个行在有唯一键约束的列(唯一键)或列集(复合唯一键)上具有重复值。

    注意:

    术语键仅指在完整性约束中定义的列。因为数据库通过在键列上隐含创建或重用索引来强制执行唯一性约束,术语唯一键有时会被错误地用作唯一键约束或唯一索引的同义词。

    唯一键约束适合于任何不允许重复值的列。唯一约束与主键约束不同,主键的目的是唯一地标识表中的每一行,通常它只要求唯一,而并不一定要有什么实际意义

    除非也指定了NOT NULL 约束,否则空值也始终满足唯一键约束。因此,典型的情况是在列上同时具有唯一键约束和非空约束。这种组合强制用户输入的是唯一值,并消除新行数据与现有行数据发生冲突的可能性。

    唯一键约束示例:

    --创建表时,指定唯一性完整性约束:
    create table test (col1 number default 0, col2 number constraint uk_col2  unique);
    
    --创建表后,指定唯一性完整性约束:
    alter table test add constraint uk_col1 unique(col1);
    

    注意:

    鉴于在多个列上的唯一键约束的搜索机制,对含有部分空值的复合唯一键约束中,在非空列中不能有相同的值。

    主键约束

    在一个主键约束中的列或列集,其值能唯一地标识行。每个表只能有一个主键,起到确定行的作用,并确保不存在任何重复的行。

    主键可以是自然键代理键。自然键是由表中的现有属性组成的一个有意义的标识符。例如,一个自然键可能是查找表中的邮政编码。相比之下,代理键是一个系统生成的递增标识符,以确保在一个表中的唯一性。通常,由一个序列生成代理键。

    Oracle数据库实现的主键约束可以保证如下行为:

     任何两行在指定的列或列集上都不具有重复值。

     主键列不允许空值。

    数据库使用索引来强制主键约束。通常,在某列上创建的主键约束会隐含创建一个唯一索引和一个非空约束。但请注意,此规则有如下例外情况:

     有时,当您使用一个可延迟的约束选项来创建一个主键时,其生成的索引不是唯一的。

    --如果可延迟约束类型是:initially deferred :
    create table test (col1 number constraint pk_col1 primary key initially deferred, col2 number constraint uk_col2  unique);
    
    --可以看到index是NONUNIQUE
    SQL> select index_name, index_type, uniqueness from user_indexes where index_name = upper('pk_col1');
    
    INDEX_NAME             INDEX_TYPE          UNIQUENES
    ------------------------------ --------------------------- ---------
    PK_COL1                NORMAL              NONUNIQUE
    
    
    --如果可延迟约束类型是:initially immediate:
    create table test (col1 number constraint pk_col1 primary key initially immediate, col2 number constraint uk_col2  unique);
    
    --此时index类型是UNIQUE
    SQL> select index_name, index_type, uniqueness from user_indexes where index_name = upper('pk_col1');
    
    INDEX_NAME             INDEX_TYPE          UNIQUENES
    ------------------------------ --------------------------- ---------
    PK_COL1                NORMAL              UNIQUE
    

    注意:

    您可以使用CREATE UNIQUE INDEX 语句,显式创建一个唯一索引。

     当你创建主键约束时,如果有一个现成的索引可用,则该主键约束会重用此索引,而不会隐式创建一个额外的新索引。

    create table test (col1 number , col2 number constraint uk_col2  unique);
    
    create index ind_col1 on test (col1);
    
    alter table test add constraint pk_col1 primary key (col1);
    
    --产看之前创建的index类型NONUNIQUE:
    SQL> select index_name, index_type, uniqueness from user_indexes where index_name = upper('ind_col1');
    
    INDEX_NAME             INDEX_TYPE          UNIQUENES
    ------------------------------ --------------------------- ---------
    IND_COL1               NORMAL              NONUNIQUE
    
    --查看由primary key 创建的 index,会发现并没有创建索引:
    SQL> select index_name, index_type, uniqueness from user_indexes where index_name = upper('pk_col1');
    
    no rows selected

    这里说个题外话,之前看到有人问有关唯一性索引和唯一性约束的如何选择的问题,从表面上看这两个都实现了约束和索引的功能,但它们在管理上还是有所不同,下面在示例中会说明:

    --创建测试表
    create table test (col1 number, col2 number);
    
    --在col1添加唯一性索引
    create unique index ind_col1 on test(col1);
    
    --在col2添加唯一性约束
    alter table test add constraint uk_col2 unique(col2);
    
    --查看唯一性索引相关信息
    select index_name, index_type, uniqueness from user_indexes where index_name = 'IND_COL1';
    --1 IND_COL1    NORMAL  UNIQUE
    
    --查看该唯一性索引是否隐式创建了约束,从数据字典发现没有
    select constraint_name, constraint_type from user_constraints where constraint_name = 'IND_COL1';
    
    --查看唯一性约束相关信息
    select constraint_name, constraint_type from user_constraints where constraint_name = 'UK_COL2';
    --1 UK_COL2 U
    
    --查看该唯一性约束是否隐式创建了索引,发现创建了唯一性索引
    select index_name, index_type, uniqueness from user_indexes where index_name = 'UK_COL2';
    --1 UK_COL2 NORMAL  UNIQUE
    
    --使UK_COL2索引不可用,发现是可以调整该索引的相关属性的
    SQL> alter index UK_COL2 unusable;
    
    Index altered.
    
    --重建UK_COL2索引
    SQL> alter index UK_COL2 rebuild;
    
    Index altered.
    
    --此时如果删除UK_COL2索引,会提示如下错误信息
    SQL> drop index UK_COL2 ;
    drop index UK_COL2
               *
    ERROR at line 1:
    ORA-02429: cannot drop index used for enforcement of unique/primary key

    外键约束

    只要两个表包含一个或多个公共列,则数据库可以通过一个外键约束(也称为参照完整性约束)来强制建立两个表之间的关系。该约束要求定义约束的列中的每个值,必须与另一个指定表中的指定列中的值相匹配。参照完整性规则的一个例子是,雇员只可以为一个现有的部门工作。

    外键

    约束定义中包含的列或列集,它引用了参考键。

    外键可以定义在多个列上。但是,复合外键必须引用具有相同数量和相同数据类型列的复合主键或复合唯一键。

    注:外键与被引用键不必同名称。

    外键的值,可以要么匹配被引用主键或唯一键的值,要么为空如果一个复合外键的任何列为空,则该键的非空部分不一定要匹配父项中的任何相应部分

    被引用键

    被外键所引用的表中的唯一键或主键。

    注:如果被引用键是唯一键的话,要显式指出。

    依赖表或子表

    包含外键的表。此表依赖于父表中被引用的唯一键或主键的值

    被引用表或父表

    由子表的外键引用的表。正是该表中的被引用值决定了在子表中特定的插入或更新是否可被允许。

    自引用完整性约束

    在这种情况下,外键引用同一个表中的父键。

    空值和外键

    关系模型允许外键的值可以匹配被引用主键或唯一键值,或者为空。

    如果一个复合外键的任何列为空,则该键的非空部分不一定要匹配父项中的任何相应部分。

    父键修改和外键

    删除父键会影响外键和父键之间的关系。

    在父键被修改时,参照完整性约束可以指定在子表中的相关行上,执行以下某种操作之一:

     对删除或更新操作,不采取任何动作

    在正常的情况下,如果结果会违反参照完整性,用户不能修改被引用的键值。

     级联删除

    级联删除(DELETE CASCADE)即是当包含被引用键值的行被删除时,导致子表中的所有的外键依赖值所在行也会被删除。

    foreign key(column_name) references table_name(column_name) on delete cascade;

     对删除置空

    删除置空(DELETE SET NULL)即是当包含被引用键值的行被删除时,导致子表中的所有的外键依赖值被全部置空。

    foreign key(column_name) references table_name(column_name) on delete set null;

    注意:

    其他Oracle数据库外键完整性约束不支持的引用性动作,可以使用数据库触发器强制执行。

    索引和外键

    作为一条规则——总是应该为外键编制索引唯一的例外是,当匹配的唯一键或主键永远不会被更新或删除时。在子表中的外键上建立索引提供了下列好处:

    可防止在子表上的全表锁定。相反,数据库只需要在索引上获取一个行锁

    消除在子表上进行全表扫描的需要

    检查性约束

    在一个列或列集上的检查约束,要求所指定的条件为真,或对每一行来说是未知的。如果DML语句导致约束条件的计算结果为假,则 SQL 语句将被回滚。

    检查约束的主要好处是,具备强制执行非常具体的完整性规则的能力

    单个列可以在其定义中包括多个检查性约束。

    如果在某列上存在多个检查约束,则他们必须被合理设计,保证他们的目的不会发生冲突。不能假定多个条件计算之间的顺序。数据库不会验证这些检查条件是否相互排斥。

    create table test (col1 number check (col1 > 0), check (col1 <0));
    

    这样的表也是被允许创建的。

    完整性约束的状态

    作为约束定义的一部分,您可以指定数据库应如何及何时强制执行该约束条件,从而确定约束状态

    对现有数据和新数据的检查

    数据库使您可以指定将某个约束应用于现有数据还是应用于新数据如果约束是启用的,则当输入或更新数据时,数据库会检查新的数据。不符合该约束的数据不能输入到数据库。例如,对 employees.department_id 启用 NOT NULL 约束,可以保证新插入的每一行都有一个部门 id。如果约束是禁用的,则表可能会包含违反约束的行。

    可以设置约束来验证 (VALIDATE) 或不验证 (NOVALIDATE) 现有数据如果指定了 VALIDATE ,则现有数据必须符合该约束。例如,对 employees.department_id启用 NOT NULL 约束并将其设置为 VALIDATE, 则会检查每个现有行都有一个部门 id。如果指定了 NOVALIDATE,则现有数据不需要符合该约束。

    VALIDATE 和 NOVALIDATE 的行为都取决于约束是启用的还是禁用的。表 5-4 总结了这些选项组合。

    这里写图片描述

    注:如果约束是disable,由约束创建的索引被删除。

    可延迟约束

    约束可能处于不可延迟(默认值) 或可延迟两种状态之一该状态确定数据库何时检查约束的有效性。下图描述了可延迟约束的选项。

    这里写图片描述

    不可延迟约束

    如果一个约束不可延迟,则Oracle数据库决不会将约束的有效性检查延迟到事务结束相反,数据库在每个语句的结尾检查约束。如果违反了约束,则该语句被回滚

    可延迟约束

    可延迟约束允许事务使用SET CONSTRAINT子句将约束检查推迟到发出 COMMIT 语句时。如果你对数据库中做了可能违反约束的更改,则此设置让您有效地禁用该约束,直到完成所有更改。

    您可以设置数据库检查可延迟约束时的默认行为。您可以指定下列属性之一:

     INITIALLY IMMEDIATE

    数据库在每个语句执行后,立即检查约束。如果违反了约束,则数据库回滚该语句。

     INITIALLY DEFERRED

    发出 COMMIT 时,数据库检查约束。如果违反了约束,则数据库回滚该事务。

    SQL> create table test (col1 number, col2 number, col3 number, col4 number);
    
    Table created.
    
    SQL> alter table test add constraint uk_col1 unique(col1) not deferrable;
    
    Table altered.
    
    SQL> alter table test add constraint uk_col2 unique(col2) initially immediate;
    
    Table altered.
    
    SQL> alter table test add constraint uk_col3 unique(col3) deferrable initially immediate;
    
    Table altered.
    
    SQL> alter table test add constraint uk_col4 unique(col4) initially deferred;
    
    Table altered.
    
    SQL> alter table test modify constraint uk_col3 initially deferred;
    
    Table altered.
    
    not deferrable 与 initially immediate相同。
    initially immediate 与 deferrable initially immediate区别:
    后者可以转换为 initially deferred,前者不可以。
    
    
    
    展开全文
  • 第7章MySQL表定义与完整性约束控制.docx
  • 掌握SQL中实现数据完整性的方法,加深理解关系数据模型的三类完整性约束
  • 展开全部数据完整性约束指的是为了防止不符合规范的数据进入数据库,在用户对数据进行插入e69da5e6ba903231313335323631343130323136353331333431366333、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行...
  • mysql数据的完整性约束(完整)

    千次阅读 2020-12-21 23:14:16
    数据完整性约束是对关系性模型完整性规则做某种约束条件。主要是保证数据库内应用数据的正确性和一致性,防止数据库中存在不符合语义的,不正确的数据。关系模型中的三类约束:一,实体完整性二,参照完整性三,用户...
  • mysql 完整性约束

    千次阅读 2021-03-15 16:54:58
    mysql 完整性约束数据的完整性概述根据完整性实施的方法将完整性约束分为四类:1、实体完整性实体完整性的实现:通过在表中设置主键约束、唯一约束或标识列来实现主键约束:应用于表列的一个约束用法:primary key...
  • MySQL讲义第12讲——完整性约束之外键(FOREIGN KEY)约束 外键(FOREIGN KEY)具有保持数据完整性和一致性的机制,目前 MySQL 只在 InnoDB 引擎下支持外键。外键具有保持数据完整性和一致性的机制,对业务处理有着...
  • 1.完整性约束命名子句 CONSTRAINT <完整性约束条件名><完整性约束条件> <完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY短语、FOREIGN KEY短语、CHECK短语等 [例5.10]建立学生登记表Student,...
  • 完整性检查是围绕完整性约束条件进行的,因此完整性约束条件是完整性控制机制的核心。 完整性约束条件作用的对象可以是关系、元组、列三种。其中列约束主要是列的类型、取值范围、精度、排序等约束条件。元组的约束...
  • 定义完整性约束

    千次阅读 2021-04-12 18:15:17
    关系模型的完整性规则是对关系的某种约束条件。在关系模型中,提供了实体完整性、参照完整性和用户定义的完整性等三项规则。下面将分别介绍MySQL中对数据库完整性三项规则的设置和实现方式。 主要内容: 1)实体完整...
  • Oracle引用完整性约束

    2021-04-06 08:34:38
    Day 4 引用完整性约束 文章目录我的Oracle数据库学习笔记一、创建两个表引用完整性约束例: --让学生成绩表中的学号与学生信息表中的学号关联 alter table stuScore add constraint fk_studentinfo_stuId foreign ...
  • 参照完整性约束

    千次阅读 2021-06-21 20:46:39
    参照完整性是指通过定义一张表中外键与另一张表中主键之间的引用规则来约束这两张表之间的联系。 参照完整性相关术语 从表:含有外键且参照其他表的表,如车辆表。从表亦称作“子表”或“参照表”。 主表:被...
  • 一.数据完整性的分类在关系模型中,提供...2.2实体完整性在MySQL中实现实体完整性在MySQL中的实现是通过主键约束和候选键约束实现的。2.2.1主键约束首先,我们来了解一下主键是什么:主键是表中的某一列或者多个列的...
  • 数据库之超详细的完整性约束

    千次阅读 2020-08-12 15:57:03
    数据库之超详细的完整性约束  数据库的完整性是指数据的正确性和相容性。数据库是否具备完整性关系到数据库系统能否真 实地反映现实世界,因此维护数据库的完整性是非常重要的。  数据库的完整性可分为实体完整性...
  • MySQL表级完整性约束

    2021-04-10 19:05:44
    MySQL表级完整性约束 为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供 了一种机制来检查数据库是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制 就是...
  • 删除完整性约束

    千次阅读 2021-04-18 21:44:59
    在MySQL中,使用alter table语句,可以独立的删除完整性约束,而不会删除表的本身。如果使用drop table语句删除一个表,那么这个表中的所有完整性约束也会自动被删除。删除完整性约束要在alter table语句中使用deop...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 202,619
精华内容 81,047
关键字:

完整性约束

友情链接: 1semi_F_current.rar