精华内容
下载资源
问答
  • MySQL - 05数据完整性

    2020-05-29 16:15:19
    什么数据完整性 数据完整性是指存储在数据库中的数据,应该保持一致性和可靠性。 关系模型允许定义三类数据约束,它们是实体完整性、参照完整性以及用户定义的完整性约束,其中前两种完整性约束由关系数据库系统...

    什么是数据完整性

    数据完整性是指存储在数据库中的数据,应该保持一致性和可靠性。
    关系模型允许定义三类数据约束,它们是实体完整性、参照完整性以及用户定义的完整性约束,其中前两种完整性约束由关系数据库系统自动支持。

    实体完整性:实体就是现实世界中的某个对象,RDBMS中一行代 表一个实体。实体完整性就是保证每一个实体都能被区别。

    域完整性:域完整性主要是对列的输入有要求,通过限制列的数据类型、格式或值的范围来实现

    参照完整性:主要是表与表之间的关系,可以通过 外键来实现

    用户自定义完整性:借助存储过程和触发器实现

    实体完整性

    实体完整性要求每张表都有唯一标识符,每张表中的主键字段不能为空且不能重复。

    学号 姓名 地址
    2019001 张三 贵州贵阳
    2019002 李芳 陕西兴平
    2019003 张晓燕 江西南昌
    2019004 刘小刚 贵州兴义
    2019005 赵天久 湖南常德

    插入错误数据
    2019003 张晓燕 江西南昌

    约束方法:唯一性约束、主键约束、标识列

    域完整性

    域完整性是针对某一具体关系数据库的约束条件,它保证表中某些列不能输入无效的值。
    域完整性指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等。

    学号 姓名 地址
    2019001 张三 贵州贵阳
    2019002 李芳 陕西兴平
    2019003 张晓燕 江西南昌
    2019004 刘小刚 贵州兴义
    2019005 赵天久 湖南常德

    插入错误数据
    20190601003 李兴才 山西大同

    约束方法:限制数据类型、检查约束、默认值、非空约束

    参照完整性

    参照完整性要求关系中不允许引用不存在的实体。

    主表:

    学号 姓名 地址
    2019001 张三 贵州贵阳
    2019002 李芳 陕西兴平
    2019003 张晓燕 江西南昌
    2019004 刘小刚 贵州兴义
    2019005 赵天久 湖南常德

    从表:

    科目 学号 分数
    计算机 2019001 99
    离散数学 2019001 87
    计算机 2019002 95

    插入错误数据
    计算机 2019008 78

    约束方法:外键约束

    用户自定义完整性

    用户自定义完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须 满足的语义要求。

    会员号 姓名 余额
    VIP001 张三 67
    VIP002 李芳 409
    VIP003 张晓燕 112
    VIP004 刘小刚 100
    VIP005 赵天久 300

    插入错误数据
    VIP006 李四 -50
    约束方法:规则、存储过程、触发器

    唯一性约束

    在MySQL中,可以使用关键字 UNIQUE 实现字段的唯一性约束,从而保证实体的完整性。

    • UNIQUE 意味着任何两条数据的同一个字段不能有相同值。
    • 一个表中可以有多个 UNIQUE 约束。
    #在创建表时添加唯一性约束
    
    create table person(
    id int not null auto_increment primary key comment '主键id', 
    name varchar(30) comment '姓名',
    id_number varchar(18) unique comment '身份证号'
    );
    

    外键约束

    外键(FOREIGN KEY)约束定义了表之间的一致性关系,用于强制参照完整性。
    外键约束定义了对同一个表或其他表的列的引用,这些列具有PRIMARY KEYUNIQUE约束。

    主表:

    #学生表
    create table stu(
    stu_no int not null primary key comment '学号',
    stu_name varchar(30) comment '姓名' );
    

    从表:

    #成绩表
    
    create table sc(
    id int not null auto_increment primary key comment '主键id', 
    stu_no int not null comment '学号',
    course varchar(30) comment '课程',
    grade int comment '成绩',
    foreign key(stu_no) references stu(stu_no)
    );
    

    在插入数据时,必 须先向主表插入, 再向从表插入。删除数据时正好相反。

    实战案例

    唯一性约束

    mysql> create table person(
        -> id int not null auto_increment primary key, 
        -> name varchar(30),
        -> id_number varchar(18) unique
        -> );
    Query OK, 0 rows affected (0.10 sec)
    
    mysql> desc person;
    +-----------+-------------+------+-----+---------+----------------+
    | Field     | Type        | Null | Key | Default | Extra          |
    +-----------+-------------+------+-----+---------+----------------+
    | id        | int         | NO   | PRI | NULL    | auto_increment |
    | name      | varchar(30) | YES  |     | NULL    |                |
    | id_number | varchar(18) | YES  | UNI | NULL    |                |
    +-----------+-------------+------+-----+---------+----------------+
    3 rows in set (0.01 sec)
    
    mysql> insert into person(name, id_number) values('Lily', '1234567890123478');
    Query OK, 1 row affected (0.02 sec)
    
    mysql> insert into person(name, id_number) values('Gray', '1234567890123478');
    ERROR 1062 (23000): Duplicate entry '1234567890123478' for key 'person.id_number'
    mysql> insert into person(name, id_number) values('Gray', '1234567890123479');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from person;
    +----+------+------------------+
    | id | name | id_number        |
    +----+------+------------------+
    |  1 | Lily | 1234567890123478 |
    |  3 | Gray | 1234567890123479 |
    +----+------+------------------+
    2 rows in set (0.00 sec)
    
    mysql> 
    
    

    外键约束

    mysql> create table stu(
        -> stu_no int not null primary key,
        -> stu_name varchar(30)
        -> );
    Query OK, 0 rows affected (0.09 sec)
    
    mysql> create table sc(
        -> id int not null auto_increment primary key, 
        -> stu_no int not null,
        -> course varchar(30),
        -> grade int,
        -> foreign key(stu_no) references stu(stu_no)
        -> );
    Query OK, 0 rows affected (0.08 sec)
    
    mysql> insert into stu(stu_no, stu_name) values('20190001', 'lily');
    Query OK, 1 row affected (0.02 sec)
    
    mysql> insert into stu(stu_no, stu_name) values('20190002', 'Gary');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from stu;
    +----------+----------+
    | stu_no   | stu_name |
    +----------+----------+
    | 20190001 | lily     |
    | 20190002 | Gary     |
    +----------+----------+
    2 rows in set (0.01 sec)
    
    mysql> insert into sc(stu_no, course, grade) values('20190001', 'math', 98);
    Query OK, 1 row affected (0.02 sec)
    
    mysql> insert into sc(stu_no, course, grade) values('20190003', 'math', 87);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mydb`.`sc`, CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`stu_no`) REFERENCES `stu` (`stu_no`))
    mysql> insert into stu(stu_no, stu_name) values('20190003', 'Tom');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into sc(stu_no, course, grade) values('20190003', 'math', 87);
    Query OK, 1 row affected (0.02 sec)
    
    mysql> select * from sc;
    +----+----------+--------+-------+
    | id | stu_no   | course | grade |
    +----+----------+--------+-------+
    |  1 | 20190001 | math   |    98 |
    |  3 | 20190003 | math   |    87 |
    +----+----------+--------+-------+
    2 rows in set (0.01 sec)
    
    mysql> 
    
    
    展开全文
  • mysql外键约束

    2017-08-29 10:41:25
    外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据完整性和一致性 二、如何创建外键外键的...

    一、为什么要外键约束???

    外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性
    二、如何创建外键?
       外键的定义:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY(建立外键的字段必须类型完全一样,如:intbigint 或者 int unsigned int 都是不行的,同时都是InnoDB) (有的 blog说只要类型相似就可以,真是误人子弟啊!!!!!)
         区别:列级约束语法和表级约束语法
    	使用列级约束语法建立外键约束直接使用references关键字,references指定该列参照的哪个主表,以及参照主表的哪一列
    
     虽然MySQL支持使用列级约束的语法来建立外键约束,但这种列级的约束语法建立的外键约束不会生效,MySQL提供这种列级约束语法仅仅是和标准SQL保持良好的兼容性。因此,如果需要MySQL中的外键约束生效,应使用表级约束语法
    使用表级约束语法,则可以需要使用foreign key来指定本表的外键列,并使用references来指定参照哪个主表,以及参照到主表的哪个列。使用表级约束语法可以使用外键的约束指定约束名,如果创建外键约束没有指定约束名,则MySQL会为该外键约束命名为table_name_ibfk_n,其中table_name是从表的表名,而n是从1开始的整数
    
    
    代码如下:
    persons 表
    CREATE TABLE `persons` (
      `Id_P` INT NOT NULL AUTO_INCREMENT,
      `name` varchar(32) NOT NULL DEFAULT '',
      PRIMARY KEY (`Id_P`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
    
    
    
    Orders表:
    
    CREATE TABLE Orders
    (
     Id_O int NOT NULL AUTO_INCREMENT,
     Id_P INT,
    PRIMARY KEY (Id_O),
    FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    这时可以建立persons和Orders外键约束关系persons为主表,Orders为从表。

    注意:在创建外键约束是出现Foreign key constraint is incorrectly formed可能参与的字段类型类型不一致导致

    如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束,请使用下面的 SQL
    
    ALTER TABLE Orders
    ADD FOREIGN KEY (Id_P)
    REFERENCES Persons(Id_P)

    撤销 FOREIGN KEY 约束

    如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:

    MySQL:

    ALTER TABLE Orders
    DROP FOREIGN KEY fk_PerOrders
    

    SQL Server / Oracle / MS Access:

    ALTER TABLE Orders
    DROP CONSTRAINT fk_PerOrders

    参考地址:http://www.w3school.com.cn/sql/sql_foreignkey.asp

    三、删除带有外键约束主表记录时出现的问题?????

    1. ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test/t_bid`, CONSTRAINT `fk_id` FOREIGN KEY (`id`) REFERENCES `t_item  
    2. ` (`id`))

    解决方法:级联删除,即在删除persons表中的记录时同时删除Orders表中的相关记录 

     (1)增加外键约束时声明级联删除,即:ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES persons(Id_P) ON DELETE CASCADE

     或者级联更新:ALTER TABLE Orders ADD CONSTRAINT orders_fk_test FOREIGN KEY (Id_P) REFERENCES persons(Id_P) ON DELETE CASCADE ON UPDATE CASCADE

    (2) 使用触发器:在删除persons表中记录之前先删除与之相关的Orders表中的记录。

    1. delimiter //    
    2. create trigger tri_delete before delete on t_item  
    3. for each row  
    4. begin  
    5.      delete from t_bid where id = old.id;  
    6. end //  




    从图可以看出::外键列必须要作为一个索引使用,如果这样的索引不存在,引用表需要自动创建索引


    展开全文
  • mysql外键

    2019-08-28 23:05:28
    可以使得两张表关联,保证数据的一致性和实现一些级联操作,保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值,可以使得两张表关联,保证数据的一致性...

    mysql外键是什么?

    一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键),外键是相对于主键说的,是建立表之间的联系的必须的前提。

    外键的作用

    可以使得两张表关联,保证数据的一致性和实现一些级联操作,保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值,可以使得两张表关联,保证数据的一致性和实现一些级联操作。简单来说:

    • 减少数据冗余
    • 保持数据的一致性、完整性
    展开全文
  • sql外键

    2012-11-03 16:15:19
     外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。   例如有两个表  A(a,b) :a为主键,b为外键(来自于B.b...
    外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的“参照完整性”的数据库实现方式。   
       
      外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。   
        例如有两个表  
      A(a,b)   :a为主键,b为外键(来自于B.b)  
      B(b,c,d)   :b为主键    
      如果我把字段b的外键属性去掉,对编程没什么影响。
      如上面,A中的b要么为空,要么是在B的b中存在的值,有外键的时候,数据库会自动帮你检查A的b是否在B的b中存在。

      1、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。  
      2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个企业现有的数据库,里面的参照完整性约束有的是外键描述,有的是用触发器实现,感觉很明显。当然,文档里可能有,但是也可能不全,但是外键就非常明显和直观。  
      3、既然我们可以用触发器或程序完成的这个工作(指参照完整性约束),DBMS已经提供了手段,为什么我们要自己去做?而且我们做的应该说没有RDBMS做得好。实际上,早期的RDBMS并没有外键,现在都有了,我认为数据库厂商增加这个功能是有道理的。从这个角度来说,外键更方便。  
      4、关于方便,根据我带项目的情况来看,程序员确实有反映,主要是在调试时输入数据麻烦:如果数据可以违反参照完整性,那么就是说参照完整性本身就不对名誉业务冲突,此时也不应该用触发期货程序实现;否则,说明数据是错误的,根本就不应该进入数据库!而且,这也应该是测试系统的一个内容:阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。

    最后说一下,建键几个原则:

    1、 为关联字段创建外键。
    2、 所有的键都必须唯一。
    3、避免使用复合键。
    4、外键总是关联唯一的键字段。 

    展开全文
  • 外键的好处

    千次阅读 2015-03-16 17:04:11
     外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。   例如有两个表  A(a,b) :a为主键,b为外键(来自于B.b) ...
  • 外键的作用?

    2017-03-10 11:06:03
    外键是数据库一级的一个完整性约束,就是数据库基础理论书... 外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了
  • 外键是数据库一级的一个完整性约束,就是数据库基础理论书中... 外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。
  • 主键、外键、索引

    2017-04-13 17:28:12
     外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。   例如有两个表  A(a,b) :a为主键,b为外键(来自于B.b...
  • sql 外键的作用

    万次阅读 2011-08-08 15:45:15
    外键是数据库一级的一个完整性约束,就是数据库基础... 外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。   例
  • 什么是数据库的参照完整性

    千次阅读 2019-09-24 06:33:02
    解答:数据库的参照完整性是指表与表之间的一种对应关系,通常情况下可以通过设置两表之间的主键、外键关系,或者编写两表的触发器来实现。 有对应参照完整性的两张表格,在对他们进行数据插入、更新、删除的过程中...
  • [转]外键的作用

    2013-08-05 20:12:49
    外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。例如有两个表A(a,b) :a为主键,b为外键(来自于B.b)B(b,c,d) :b...
  • 外键是数据库一级的一个完整性约束,就是数据库基础... 外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。 
  • 后来翻了上学时候的书《数据库系统设计 实现与管理》(第六版)第73页3.3节“表3-4 完整性规则”中要求: 1. 实体完整性 1.1 要求:所有主键标实体都是惟一的,而且主键标的任何部分不可以是空值; 1.2 目的:...
  • 转载的 C#.NET面试题

    千次阅读 2015-11-20 10:45:13
    其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。 2.什么是事务?什么是锁?答:事务是...
  • 数据完整性如何保证?性能是如何权衡的?——恐怕设计者就该崩溃了。.  这也难怪,设计、开发人员在学校中学习数据库时,理论书籍离实际开发较远——试问有几个人能够以可实践的方式把规范化的几条原则阐述清楚?...
  • 数据完整性如何保证?性能是如何权衡的?——恐怕设计者就该崩溃了。.  这也难怪,设计、开发人员在学校中学习数据库时,理论书籍离实际开发较远——试问有几个人能够以可实践的方式把规范化的几条原则阐述清楚?...
  • InnoDB和MyISAM区别简要了解 innodb 支持事务(ACID)和行级锁 innodb支持外键 ...加速表与表之间的连接,特别是在实现数据的参考完整性方面有意义 为什么不对表中每一个列创建索引? 当对表中的数...
  • mysql 中外键的作用

    2016-09-19 12:55:50
     外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。   例如有两个表   A(a,b) :a为主键,b为外键(来自于B...
  • 数据库索引的优缺点

    2015-01-09 09:18:35
    第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。  [参照完整性,表间主键外键的关系。] 第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分
  • 2. 维护数据库的数据完整性和一致性的方式有哪些? 可以使用约束(比如:check约束、主/外键约束等)、这样做效率最高。其次是使用触发器,这种方式可以保证不管在什么业务场景下都能够保证数据的一致性。再次,可以...
  • 发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户...在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作
  • 发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,...在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据
  • MySql之约束

    2021-01-02 20:34:00
    这里写目录标题约束(Constraint)基础非空约束唯一性约束(unqiue)...在创建表的时候,可以给表额字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。 常见的约束有哪些呢? 非空约束(not
  • C#面试题

    万次阅读 2020-08-24 17:12:56
    其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。 2.什么是事务?什么是锁? 答:...
  • 便于维护完整性;能够实现数据的安全性。 2:数据的存储形式:层次模型;网状模型;关系模型;对象模型。 3:关系模型的理论是1970年有IBM的Codd博士提出的。 4:实体所具有的某一特性称为属性。 5:主键,外键...
  • SqlServer 触发器 详细讲解

    千次阅读 2020-07-28 20:32:13
    什么是触发器 触发器是一个在修改指定表值得数据时执行的存储过程,不同的是...触发器的主要作用就是能够实现主键和外键所不能保证的复杂的参照完整性数据的一致性,它能够对数据库中的相关表进行级联修改,能够提
  • .net 面试题

    2019-07-10 16:49:00
    其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策 2 : ADO。NET相对于ADO等主要有什么...
  • asp.net面试集合

    2019-01-07 23:45:41
    其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策2 : ADO。NET相对于ADO等主要有什么改进...
  • C#120问(重点难点)

    2013-07-31 11:32:30
    摘抄了里面两个问题,还有120个,真的很不错 1.维护数据库的完整性、一致性、...SqlServer自动锁定特定记录、字段或文件,防止用户访问,以维护数据安全或防止并发数据操作问题,锁可以保证事务的完整性和并发性。

空空如也

空空如也

1 2 3 4
收藏数 73
精华内容 29
关键字:

外键可以实现什么数据完整性