精华内容
下载资源
问答
  • 完整性约束

    2017-09-13 14:33:55
    完整性约束

    1、概念
    完整性约束是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。

    通常包括:域完整性约束、实体完整性约束、参照完整性约束、用户自定义完整性约束。

    1)域完整性约束
    域完整性是保证数据库字段取值的合理性。

    一般包括检查(CHECK)、默认值(DEFAULT)、不为空(NOT NULL)、外键(FOREIGN KEY)等约束。

    2)实体完整性约束
    实体完整性(Entity integrity)是指关系的主关键字不能重复也不能取“空值”。

    3)参照完整性
    参照完整性(Referential Integrity)是指建立关系之间联系的主关键字与外部关键字引用的约束条件。

    展开全文
  • 要想了解这三类完整性约束首先要了解什么是数据完整性。数据完整性是指数据库中存储的数据是有意义的或正确的,和现实世界相符。关系模型中三类完整性约束: – 实体完整性(Entity Integrity) – 参照完整性...

    数据完整性

    要想了解这三类完整性约束首先要了解什么是数据完整性。数据完整性是指数据库中存储的数据是有意义的或正确的,和现实世界相符。关系模型中三类完整性约束:
    – 实体完整性(Entity Integrity)
    – 参照完整性(Referential Integrity)
    – 用户定义的完整性(User-defined Integrity) •
    实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持

    实体完整性

    • 保证关系中的每个元组都是可识别的和惟一的 • 指关系数据库中所有的表都必须有主键,而且表中不允
    许存在如下记录:
    – 无主键值的记录
    – 主键值相同的记录
    • 原因:实体必须可区分
    例如:
    在这里插入图片描述
    上图就出现了主键值(学号是主键)重复的情况。当在表中定义了主键时,数据库管理系统会自动保证数据的实体完整性,即保证不允许存在主键值为空的记录以及主键值重复的记录。

    参照完整性

    也称为引用完整性
    • 现实世界中的实体之间往往存在着某种联系,在关系模型中,实体以及实体之间的联系都是用关系来表示的,这样就自然存在着关系与关系之间的引用
    • 参照完整性就是描述实体之间的联系的
    • 参照完整性一般是指多个实体或关系之间的关联关系
    在这里插入图片描述
    此完整性涉及到了外键:
    • 参照完整性规则就是定义外键与被参照的主键之间的引用规则
    • 外键一般应符合如下要求:
    – 或者值为空
    – 或者等于其所参照的关系中的某个元组的主键值

    用户定义完整性

    • 也称为域完整性或语义完整性
    • 是针对某一具体应用领域定义的数据约束条件
    • 反映某一具体应用所涉及的数据必须满足应用语义的要求
    • 实际上就是指明关系中属性的取值范围,防止属性的值与应用语义矛盾
    • 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统方法处理它们,而不要由应用程序承担这一功能

    展开全文
  • (本次实验难点是完整性约束,特别是参照完整性约束(主外键)!应注意对完整性约束作验证,关键给出违反约束的验证,要说明理由)
  • 5.4完整性约束命名子句 1.完整性约束命名子句 CONSTRAINT<完整性约束条件名><完整性约束条件> <完整性约束条件>包括NOT NULL,UNIQUE ,PRIMARY KEY短语以及FOREIGN KEY短语CHECK短语等 CONSTRAINT ...

    关注公众号凡花花的小窝,收获更多的考研计算机专业编程相关的资料
    第二十二讲 约束命名子句和断言

    5.4完整性约束命名子句
    1.完整性约束命名子句
    CONSTRAINT<完整性约束条件名><完整性约束条件>
    <完整性约束条件>包括NOT NULL,UNIQUE ,PRIMARY KEY短语以及FOREIGN KEY短语CHECK短语等
    CONSTRAINT 约束

    CONSTRAINT <完整性约束条件名>
    [PRIMARY KEY短语
    |FOREIGN KEY短语
    |CHECK短语]

    [例10] 建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
    CREATE TABLE Student
    (Sno NUMERIC(6)
    CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
    Sname CHAR(20)
    CONSTRAINT C2 NOT NULL,
    Sage NUMERIC(3)
    CONSTRAINT C3 CHECK (Sage < 30),
    Ssex CHAR(2)
    CONSTRAINT C4 CHECK (Ssex IN ( ‘男’,‘女’)),
    CONSTRAINT StudentKey PRIMARY KEY(Sno)
    );
    在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束。
    eg5.11建立教师表TEACHER,要去每个教师应该发的工资不低于3000元,应该发的工资应该是工资列Sal与扣除项Deduct之和
    CREATE TABLE TEACHER
    (Eno NUMERIC(4) PRIMARY KEY
    在列级定义主码
    Ename CHAR(10),
    Job CHAR(8),
    Sal NNUMERIC(7,2),
    Deduct NUMERIC(7,2),
    Deptno NUMERIC92),
    constraint teacherfkEY foreign key(Deptno)
    REFERENCES DEPT(Deptno),
    CONSTRAINT C1 CHECK(Sal+Deduct>=3000));

    1. 修改表中的完整性限制
      使用ALTER TABLE语句修改表中的完整性限制
      eg:去掉eg5.10Student表中对性别的限制
      ALTER TABLE Student
      DROP CONSTRAINT C4;

    [例13] 修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40
    可以先删除原来的约束条件,再增加新的约束条件
    ALTER TABLE Student
    DROP CONSTRAINT C1;
    ALTER TABLE Student
    ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999),
    ALTER TABLE Student
    DROP CONSTRAINT C3;
    ALTER TABLE Student
    ADD CONSTRAINT C3 CHECK (Sage < 40);

    *5.5 域中的完整性限制
    SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件。
    [例14]建立一个性别域,并声明性别域的取值范围
    CREATE DOMAIN GenderDomain CHAR(2)
    CHECK (VALUE IN (‘男’,‘女’) );
    这样[例10]中对Ssex的说明可以改写为
    Ssex GenderDomain
    [例15]建立一个性别域GenderDomain,并对其中的限制命名
    CREATE DOMAIN GenderDomain CHAR(2)
    CONSTRAINT GD CHECK ( VALUE IN (‘男’,‘女’) );

    [例16]删除域GenderDomain的限制条件GD。
    ALTER DOMAIN GenderDomain
    DROP CONSTRAINT GD;
    [例17]在域GenderDomain上增加限制条件GDD。
    ALTER DOMAIN GenderDomain
    ADD CONSTRAINT GDD CHECK (VALUE IN ( ‘1’,‘0’) );
    通过[例16]和[例17],就把性别的取值范围由(‘男’,‘女’)改为 ( ‘1’,‘0’)

    5.6断言
    SQL中,可以使用CREATE ASSERTION语句,通过声明性断言来指明更具有一般性的约束
    可以定义设计多个表或者聚集操作的比较复杂的完整性约束
    断言创建以后,任何对断言中所设计的关系的操作都会触发关系数据库管理系统对断言的检查,任何让断言不为真值的操作都会被拒绝执行。
    1.创建断言的语句格式
    CREATE ASSERTION<断言名>< CHECK 子句>
    每一个断言都被赋予了一个名字
    <CHECK子句>中的约束条件与WHERE子句的条件表达式类似

    eg5.18 限制数据库课程最多有60名学生选修
    CREATE ASSERTION ASSE_SC_DB_NUM
    CHECK(60>=(select count())
    From Couse,SC
    WhereSC.Nno=Couse.Cno and Cousr.Cname=‘数据库’)
    );
    触发时机:向SC表中插入元组
    违约反映:拒绝执行
    eg.5.19限制每一门课程最多有60名学生选修
    CREATE ASSERTION ASSE_SC_CNUM1
    CHECK (60>=ALL(sELECT count(
    )
    FROM SC
    GROUP by cno));

    eg5.20 限制每个学期每一门课程最多有60名学生选修
    首先需要修改SC表的模式,增加一个学期(TERM)属性
    ALTER TABLE SC ADD TERM DATE;

    然后定义断言:
    CREATE ASSERTION ASSE_SC_CNUM2
    CHECK(60>=ALL(sELECT count(*)
    FROM SC
    GROUP by cno,Term));
    如果断言很复杂,则系统检测和维护断言的开销很高的时候,这是在使用断言的时候应该注意的。
    2.删除断言的语句格式
    DROP ASSERTION <断言名>;

    小结:
    完整性约束命名子句
    命名完整性约束
    使用ALTER TABLE 语句修改完整性约束,增加/删除/修改完整性约束
    断言
    定义断言
    用断言定义复杂完整性约束
    删除断言

    第二十三讲 触发器
    触发器Trigger
    是用户定义在关系表上的一类由事件驱动的特殊过程
    任何的用户对于表的增,删,改操作均由服务器自动激活相应的触发器
    触发器可以实时更加复杂的检查和操作,具有更加精细和更加强大的数据控制能力
    5.7.1定义触发器
    CREATE TRIGGER语法格式
    CREATE TRIGGER<触发器名>
    {BEFORE|ALTER}<触发事件> ON<表名>
    REFERENCING NEW |OLD ROW AS<变量>
    FOR EACH {ROW|SATATEMENT}
    [WHEN<触发条件>]<触发动作>
    CREATE TRIGGER
    表上的拥有者才可以在表上创建触发器
    触发器名
    触发器名可以包含模式名,也可以不包含模式名
    同一个模式下,触发器名必须是唯一的
    触发事件
    INSERT ,DELETE或者UPDATE
    几个事件的组合
    UPDATE OF<触发列,…>

    AFTER|BEFORE是触发时机
    AFTER表示在触发事件的操作执行之后激活触发器
    BEFORE表示在触发事件的操作执行之前激活触发器

    表名
    触发器只能定义在基本表上,不能定义在视图上
    当基本表的数据发生变化的时候,将激活定义在该表上相应触发事件的触发器

    触发器的类型
    行级触发器FOR EACH ROW
    语句级触发器 FOR EACH STATEMENT

    定义触发器的语法说明:

    1. 创建者:表的拥有者
    2. 触发器名
    3. 表名:触发器的目标表
    4. 触发事件:INSERT、DELETE、UPDATE
    5. 触发器类型
      行级触发器(FOR EACH ROW)
      语句级触发器(FOR EACH STATEMENT)

    例如,假设在[例11]的TEACHER表上创建了一个AFTER UPDATE触发器。如果表TEACHER有1000行,执行如下语句:
    UPDATE TEACHER SET Deptno=5;
    如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次
    如果是行级触发器,触发动作将执行1000次

    触发器被激活的时候,只有当触发条件为真的时候 触发动作体才执行,否则触发动作体不执行
    如果省略WHEN触发条件,则触发动作提在触发器激活后立即执行
    6. 触发条件
    触发条件为真
    省略WHEN触发条件

    1. 触发动作体
      触发动作体可以是一个匿名PL/SQL过程块
      也可以是对已创建存储过程的调用
      触发动作体可以是一个匿名PL/SQL 过程块,也可以是对已创建存储过 程的调用
      • 如果是行级触发器,用户都可以在 过程体中使用NEW和OLD引用事件 之后的新值和事件之前的旧值
      • 如果是语句级触发器,则不能在触 发动作体中使用NEW或OLD进行引 用
      • 如果触发动作体执行失败,激活触 发器的事件就会终止执行,触发器 的目标表或触发器可能影响的其他 对象不发生任何变化

    触发事件
    当特定的系统事件发生的时候,对规则的条件进行检查,如果条件成立则执行规则中的东郭庄,否则不执行改动作,规则中的动作提可以很复杂,通常是一段SQL存储过程

    当特定的系统事件发生的时候,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作,规则中的动作提可以很复杂,通常是一段SQL存储过程
    触发器又叫做事件-条件-动作event-condition-action规则
    在这里插入图片描述REFERENCING
    OLD ROW AS OLDTUPLE
    eg5.22.将每次对表Student的插入操作所增加的学生个数记录到表StudentInsertLog中
    CREATE TRIGGER Student_Count
    AFTER INSERT ON STUdent
    REFERENCING
    NEW TABLE AS DELTA
    FOR EACH STATEMNET
    INSERT INTO StudentInsertLog(Numers)
    SELECT COUNT(*) FROM DELTA
    在这里插入图片描述
    [例18] 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
    CREATE TRIGGER Insert_Or_Update_Sal
    BEFORE INSERT OR UPDATE ON Teacher
    /触发事件是插入或更新操作/
    FOR EACH ROW /行级触发器/
    AS BEGIN /定义触发动作体,是PL/SQL过程块/
    IF (new.Job=‘教授’) AND (new.Sal < 4000) THEN
    new.Sal :=4000;
    END IF;
    END;

    [例19]定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录
    首先建立工资变化表Sal_log
    CREATE TABLE Sal_log
    (Eno NUMERIC(4) references teacher(eno),
    Sal NUMERIC(7,2),
    Username char(10),
    Date TIMESTAMP
    );

    [例19](续)
    CREATE TRIGGER Insert_Sal
    AFTER INSERT ON Teacher /触发事件是INSERT/
    FOR EACH ROW
    AS BEGIN
    INSERT INTO Sal_log VALUES(
    new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
    END;

    [例19](续)
    CREATE TRIGGER Update_Sal
    AFTER UPDATE ON Teacher /*触发事件是UPDATE */
    FOR EACH ROW
    AS BEGIN
    IF (new.Sal <> old.Sal) THEN INSERT INTO Sal_log VALUES(
    new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
    END IF;
    END;

    5.6.2 激活触发器
    触发器的执行,是由触发事件激活的,并且由数据库服务器自动执行的
    一个数据表上可能定义了多个触发器,遵循如下的执行顺序
    1.执行该表上的BEFORE触发器
    2.激活触发器的SQL语句
    3.执行该表上的AFTER触发器

    [例20]执行修改某个教师工资的SQL语句,激活上述定义的触发器。
    UPDATE Teacher SET Sal=800 WHERE Ename=‘陈平’;
    执行顺序是:
    执行触发器Insert_Or_Update_Sal
    执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename=‘陈平’;”
    执行触发器Insert_Sal;
    执行触发器Update_Sal

    5.7.3删除触发器
    删除触发器的SQL语法
    DROP TRIGGER <触发器名称> ON<表名>;
    触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除

    [例21] 删除教师表Teacher上的触发器Insert_Sal
    DROP TRIGGER Insert_Sal ON Teacher;

    完整性约束定义机制
    在CREATE TABLE中定义
    用断言定义
    用触发器定义
    完整性检查机制
    违背了完整性约束条件的时候RDBMS采取的动作
    数据库的完整性是为了保证数据库中存储的数据是正确的

    在这里插入图片描述

    展开全文
  • 数据完整性约束是在表和字段上强制执行的数据检验规则,为了防止不规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,主要是对空值和重复值的约束,使不...

    数据完整性约束是在表和字段上强制执行的数据检验规则,为了防止不规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,主要是对空值和重复值的约束,使不符合规范的数据不能进入数据库,以保证数据存储的完整性和准确性。

    完整性分类

    按照约束的不同类型可以分为实体完整性、域完整性、参照完整性、用户自定义完整性。

    实体完整性

    用来标识表中的每一条记录,一条记录代表一个实体(entity)。

    主键约束(primary key)

    • 每个表中只能有一个主键。
    • 主键值须非空不重复。
    • 可设置单字段主键,也可设置多字段联合主键。
    • 联合主键中多个字段的数据完全相同时,才违反主键约束。

    列级添加主键约束:

    creat table <表名> (
    <字段名1> <字段类型1> primary key,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>);

    示例:

    mysql> create table employee(
        -> e_id int primary key,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);

    表级添加主键约束:

    create table <表名>(
    <字段名1> <字段类型1>,
    <字段名2> <字段类型2>,
    ......
    <字段名n> <字段类型n>,
    [constraint 主键约束名] primary key(字段名1[,字段名2,...字段名n]));

    示例:

    mysql> create table employee(
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int,
        -> primary key(e_name,e_sex));

    已有表添加主键约束:

    alter table <表名> add [constraint 主键约束名] primary key(字段名);

    示例:

    -- 创建无主键约束的表
    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);
    -- 添加主键约束
    mysql> alter table employee add primary key(e_id);

    删除主键约束:

    alter table <表名> drop primary key;

    示例:

    alter table employee drop primary key;

    唯一约束(unique)

    • 指定列的数据不能重复。
    • 可以为空,但只能出现一个空值。

    列级添加唯一约束:

    creat table <表名> (
    <字段名1> <字段类型1> unique,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>);

    示例:

    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5) unique,
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);

    表级添加唯一约束:

    creat table <表名> (
    <字段名1> <字段类型1>,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>,
    [constraint 唯一约束名] unique (字段名1[,字段名2...字段名n]));

    示例:

    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int,
        -> unique (e_name,e_sex));

    已有表添加唯一约束:

    alter table <表名> add [constraint 唯一约束名] unique (字段名);

    示例:

    -- 创建表
    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);
    -- 添加唯一约束
    mysql> alter table employee add unique(e_name);

    删除唯一约束:

    alter table <表名> drop index <唯一约束名>;

    如果单个字段没有指定唯一约束名,则默认的唯一约束名为字段名。如果是多个字段组合为唯一约束时候,默认的唯一约束名为第一个字段的名称。如果指定了约束名,则删除的时候写约束名。

    示例:

    alter table employee drop index e_name;

    自动增长列(auto_increment)

    • 指定字段的数据自动增长。
    • 配合主键一起使用,并且只适用于整数类型。
    • 默认从1开始,每增加一条记录,该字段的值会增加1。
    • 即使数据删除,还是从删除的序号继续增长。

    创建自动增长约束:

    creat table <表名> (
    <字段名1> <字段类型1> primary key auto_increment,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>);

    示例:

    mysql> create table employee(
        -> e_id int primary key auto_increment,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);

    已有表添加自动增长约束:

    alter table <表名> modify <字段名> <字段类型> auto_increment;

    示例:

    -- 创建无自增约束的表

    mysql> create table employee(
        -> e_id int primary key,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);
    -- 添加自增约束
    alter table employee modify e_id int auto_increment;

    设置自动增长初始值:

    alter table <表名> auto_increment=初始值;

    示例:

    alter table employee auto_increment=1000;

    删除自增约束:

    alter table <表名> modify <字段名> <字段类型>;

    示例:

    alter table employee modify e_id int;

    域完整性

    域完整性是针对单元格的约束,不与其它行参考比较。

    非空约束(not null)

    • 字段的值不能为空。

    创建非空约束:

    creat table <表名> (
    <字段名1> <字段类型1> not null,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>);

    示例:

    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5) not null,
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);

    已有表添加非空约束:

    alter table <表名> modify <字段名> <字段类型> not null;

    示例:

    -- 创建表
    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);
    -- 添加非空约束
    alter table employee modify e_name int not null;

    删除非空约束:

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

    示例:

    alter table employee modify e_name int;

    默认约束(default)

    • 如果新插入一条记录时没有为该字段赋值,系统会自动为这个字段赋值为默认约束设定的值。
    • 如果插入的数据为“null”,则不会使用默认值,只有没有插入数据时候,才会使用默认值。

    创建默认约束:

    creat table <表名> (
    <字段名1> <字段类型1> default value,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>);

    示例:

    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int default 0,
        -> d_id int);

    已有表添加默认约束:

    alter table <表名> modify <字段名> <字段类型> default value;

    示例:

    -- 创建表
    mysql> create table employee(
        -> e_id int,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);
    -- 添加默认约束
    alter table employee modify e_age int default 0;

    删除默认约束:

    alter table <表名> modify <字段名> <字段类型>;

    示例:

    alter table employee modify e_age int;

    参照完整性

    参照完整性指多表之间的对应关系,在一张表中执行数据插入、更新、删除等操作时,DBMS都会跟另一张表进行对照,避免不规范的操作,以确保数据存储的完整性。

    外键约束(foreign key)

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

    主键所在的表为主表,外键所在的表为从表

    每一个外键值必须与另一个表中的主键值相对应

    创建外键约束:

    creat table <表名> (
    <字段名1> <字段类型1>,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>,
    [constraint 外键约束名] foreign key(字段名) references <主表>(主键字段));

    示例:

    -- 创建一个主表
    mysql> create table department(
        -> d_id int primary key,
        -> d_name varchar(5),
        -> d_num int);
    -- 创建从表的同时添加外键
    mysql> create table employee(
        -> e_id int primary key,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int,
        -> foreign key(d_id) references department(d_id));

    已有表中添加外键约束:

    alter table <表名> add [constraint 外键约束名] foreign key(字段名) references <主表>(主键字段);

    示例:

    -- 创建一个主表
    mysql> create table department(
        -> d_id int primary key,
        -> d_name varchar(5),
        -> d_num int);
    -- 创建从表
    mysql> create table employee(
        -> e_id int primary key,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);
    -- 添加外键约束
    mysql> alter table employee add constraint fk_d_id foreign key(d_id) references department(d_id));

    删除外键约束:

    alter table <表名> drop foreign key <外键约束名>;

    示例:

    alter table employee drop foreign key fk_d_id;
    • 先删除从表再删除主表。
    • 先删除外键约束,再删除表。

    用户自定义完整性

    根据用户实际的完整性要求来定义,在执行数据插入、更新等操作时,DBMS会检查数据是否满足检查约束中的限定条件,避免不符合条件的操作,以保证数据存储的准确性。

    检查约束(check)

    • 指定需要检查的限定条件。

    创建检查约束:

    creat table <表名> (
    <字段名1> <字段类型1>,
    <字段名2> <字段类型2>,
    ……
    <字段名n> <字段类型n>,
    check(<限定条件>));

    示例:

    mysql> create table employee(
        -> e_id int primary key,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int,
        -> check(e_age>=0));

    已有表添加检查约束:

    alter table <表名> add constraint <检查约束名> check(<限定条件>);

    示例:

    -- 创建表
    mysql> create table employee(
        -> e_id int primary key,
        -> e_name varchar(5),
        -> e_sex varchar(5),
        -> e_age int,
        -> d_id int);
    -- 添加检查约束
    mysql> alter table employee add constraint ch_e_age check(e_age>=0));

    删除检查约束:

    alter table <表名> drop constraint <检查约束名>;

    示例:

    mysql> alter table employee drop constraint ch_e_age;
    展开全文
  • 前言:数据完整性约束是一组完整性规则的集合。它定义了数据模型必须遵守的语义约束,也规定了根据数据模型所构建的数据库中数据内部及其数据相互间联系所必须满足的语义约束,约束是添加到列上的,用来约束列。完整...
  • 数据完整性约束指的是为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,809
精华内容 4,723
关键字:

完整性约束