精华内容
下载资源
问答
  • 外键约束

    2011-01-02 22:56:00
    文章分类:数据库 关键字: 外键约束, 外键 如果表A的主关键字是表B中的字段,则该字段...这里以MySQL为例,总结一下3种外键约束方式的区别和联系。 这里以用户表用户组表为例,这是一个典型的多对一关系,多个...

    文章分类:数据库 关键字: 外键约束, 外键

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。

         这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
         首先创建用户组表:
    Sql代码 复制代码
    1. create table t_group (   
    2.     id int not null,   
    3.     name varchar(30),   
    4.     primary key (id)   
    5. );  
    create table t_group (id int not null,name varchar(30),primary key (id));


    并插入两条记录:
    Sql代码 复制代码
    1. insert into t_group values (1, 'Group1');   
    2. insert into t_group values (2, 'Group2');  
    insert into t_group values (1, 'Group1');insert into t_group values (2, 'Group2');


    下面创建用户表,分别以不同的约束方式创建外键引用关系:
    1、级联(cascade)方式
    Sql代码 复制代码
    1. create table t_user (   
    2.     id int not null,   
    3.     name varchar(30),   
    4.     groupid int,   
    5.     primary key (id),   
    6.     foreign key (groupid) references t_group(id) on delete cascade on update cascade  
    7. );  
    create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete cascade on update cascade);


    参照完整性测试
    Sql代码 复制代码
    1. insert into t_user values (1, 'qianxin', 1); --可以插入   
    2. insert into t_user values (2, 'yiyu', 2);    --可以插入   
    3. insert into t_user values (3, 'dai', 3);    --错误,无法插入,用户组3不存在,与参照完整性约束不符  
    insert into t_user values (1, 'qianxin', 1); --可以插入insert into t_user values (2, 'yiyu', 2);    --可以插入insert into t_user values (3, 'dai', 3);    --错误,无法插入,用户组3不存在,与参照完整性约束不符


    约束方式测试
    Sql代码 复制代码
    1. insert into t_user values (1, 'qianxin', 1);   
    2. insert into t_user values (2, 'yiyu', 2);   
    3. insert into t_user values (3, 'dai', 2);   
    4. delete from t_group where id=2;              --导致t_user中的2、3记录级联删除   
    5. update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid级联修改为2  
    insert into t_user values (1, 'qianxin', 1);insert into t_user values (2, 'yiyu', 2);insert into t_user values (3, 'dai', 2);delete from t_group where id=2;              --导致t_user中的2、3记录级联删除update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid级联修改为2


    2、置空(set null)方式
    Sql代码 复制代码
    1. 置空方式   
    2. create table t_user (   
    3.     id int not null,   
    4.     name varchar(30),   
    5.     groupid int,   
    6.     primary key (id),   
    7.     foreign key (groupid) references t_group(id) on delete set null on update set null  
    8. );   
    9.   
    10. 参照完整性测试   
    11.   
    12. insert into t_user values (1, 'qianxin', 1); --可以插入   
    13. insert into t_user values (2, 'yiyu', 2);    --可以插入   
    14. insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符   
    15.   
    16. 约束方式测试   
    17. insert into t_user values (1, 'qianxin', 1);   
    18. insert into t_user values (2, 'yiyu', 2);   
    19. insert into t_user values (3, 'dai', 2);   
    20. delete from t_group where id=2;              --导致t_user中的2、3记录的groupid被设置为NULL   
    21. update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid被设置为NULL  
    置空方式create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete set null on update set null);参照完整性测试insert into t_user values (1, 'qianxin', 1); --可以插入insert into t_user values (2, 'yiyu', 2);    --可以插入insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符约束方式测试insert into t_user values (1, 'qianxin', 1);insert into t_user values (2, 'yiyu', 2);insert into t_user values (3, 'dai', 2);delete from t_group where id=2;              --导致t_user中的2、3记录的groupid被设置为NULLupdate t_group set id=2 where id=1;          --导致t_user中的1记录的groupid被设置为NULL



    3、禁止(no action / restrict)方式
    Sql代码 复制代码
    1. 禁止方式   
    2. create table t_user (   
    3.     id int not null,   
    4.     name varchar(30),   
    5.     groupid int,   
    6.     primary key (id),   
    7.     foreign key (groupid) references t_group(id) on delete no action on update no action  
    8. );   
    9.   
    10. 参照完整性测试   
    11. insert into t_user values (1, 'qianxin', 1); --可以插入   
    12. insert into t_user values (2, 'yiyu', 2);    --可以插入   
    13. insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符   
    14.   
    15. 约束方式测试   
    16. insert into t_user values (1, 'qianxin', 1);   
    17. insert into t_user values (2, 'yiyu', 2);   
    18. insert into t_user values (3, 'dai', 2);   
    19. delete from t_group where id=2;              --错误,从表中有相关引用,因此主表中无法删除   
    20. update t_group set id=2 where id=1;          --错误,从表中有相关引用,因此主表中无法修改  
    禁止方式create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete no action on update no action);参照完整性测试insert into t_user values (1, 'qianxin', 1); --可以插入insert into t_user values (2, 'yiyu', 2);    --可以插入insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符约束方式测试insert into t_user values (1, 'qianxin', 1);insert into t_user values (2, 'yiyu', 2);insert into t_user values (3, 'dai', 2);delete from t_group where id=2;              --错误,从表中有相关引用,因此主表中无法删除update t_group set id=2 where id=1;          --错误,从表中有相关引用,因此主表中无法修改

    转载于:https://www.cnblogs.com/dirichlet/archive/2011/01/02/1924298.html

    展开全文
  • sql 外键约束

    2013-04-21 18:49:22
    外键约束 文章分类:数据库 关键字: 外键约束, 外键 如果表A的主关键字是表B中的字段,则该字段称为表B...这里以MySQL为例,总结一下3种外键约束方式的区别和联系。 这里以用户表用户组表为例,这是一个
    
    

    文章分类:数据库 关键字: 外键约束, 外键

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。

    这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
    首先创建用户组表:
    Sql代码 复制代码
    1. create table t_group (
    2. id int not null,
    3. name varchar(30),
    4. primary key (id)
    5. );
    create table t_group (id int not null,name varchar(30),primary key (id));


    并插入两条记录:
    Sql代码 复制代码
    1. insert into t_group values (1, 'Group1');
    2. insert into t_group values (2, 'Group2');
    insert into t_group values (1, 'Group1');insert into t_group values (2, 'Group2');


    下面创建用户表,分别以不同的约束方式创建外键引用关系:
    1、级联(cascade)方式
    Sql代码 复制代码
    1. create table t_user (
    2. id int not null,
    3. name varchar(30),
    4. groupid int,
    5. primary key (id),
    6. foreign key (groupid) references t_group(id) on delete cascade on update cascade
    7. );
    create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete cascade on update cascade);


    参照完整性测试
    Sql代码 复制代码
    1. insert into t_user values (1, 'qianxin', 1); --可以插入
    2. insert into t_user values (2, 'yiyu', 2); --可以插入
    3. insert into t_user values (3, 'dai', 3); --错误,无法插入,用户组3不存在,与参照完整性约束不符
    insert into t_user values (1, 'qianxin', 1); --可以插入insert into t_user values (2, 'yiyu', 2);    --可以插入insert into t_user values (3, 'dai', 3);    --错误,无法插入,用户组3不存在,与参照完整性约束不符


    约束方式测试
    Sql代码 复制代码
    1. insert into t_user values (1, 'qianxin', 1);
    2. insert into t_user values (2, 'yiyu', 2);
    3. insert into t_user values (3, 'dai', 2);
    4. delete from t_group where id=2; --导致t_user中的2、3记录级联删除
    5. update t_group set id=2 where id=1; --导致t_user中的1记录的groupid级联修改为2
    insert into t_user values (1, 'qianxin', 1);insert into t_user values (2, 'yiyu', 2);insert into t_user values (3, 'dai', 2);delete from t_group where id=2;              --导致t_user中的2、3记录级联删除update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid级联修改为2


    2、置空(set null)方式
    Sql代码 复制代码
    1. 置空方式
    2. create table t_user (
    3. id int not null,
    4. name varchar(30),
    5. groupid int,
    6. primary key (id),
    7. foreign key (groupid) references t_group(id) on delete set null on update set null
    8. );
    9. 参照完整性测试
    10. insert into t_user values (1, 'qianxin', 1); --可以插入
    11. insert into t_user values (2, 'yiyu', 2); --可以插入
    12. insert into t_user values (3, 'dai', 3); --错误,无法插入,用户组3不存在,与参照完整性约束不符
    13. 约束方式测试
    14. insert into t_user values (1, 'qianxin', 1);
    15. insert into t_user values (2, 'yiyu', 2);
    16. insert into t_user values (3, 'dai', 2);
    17. delete from t_group where id=2; --导致t_user中的2、3记录的groupid被设置为NULL
    18. update t_group set id=2 where id=1; --导致t_user中的1记录的groupid被设置为NULL
    置空方式create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete set null on update set null);参照完整性测试insert into t_user values (1, 'qianxin', 1); --可以插入insert into t_user values (2, 'yiyu', 2);    --可以插入insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符约束方式测试insert into t_user values (1, 'qianxin', 1);insert into t_user values (2, 'yiyu', 2);insert into t_user values (3, 'dai', 2);delete from t_group where id=2;              --导致t_user中的2、3记录的groupid被设置为NULLupdate t_group set id=2 where id=1;          --导致t_user中的1记录的groupid被设置为NULL



    3、禁止(no action / restrict)方式
    Sql代码 复制代码
    1. 禁止方式
    2. create table t_user (
    3. id int not null,
    4. name varchar(30),
    5. groupid int,
    6. primary key (id),
    7. foreign key (groupid) references t_group(id) on delete no action on update no action
    8. );
    9. 参照完整性测试
    10. insert into t_user values (1, 'qianxin', 1); --可以插入
    11. insert into t_user values (2, 'yiyu', 2); --可以插入
    12. insert into t_user values (3, 'dai', 3); --错误,无法插入,用户组3不存在,与参照完整性约束不符
    13. 约束方式测试
    14. insert into t_user values (1, 'qianxin', 1);
    15. insert into t_user values (2, 'yiyu', 2);
    16. insert into t_user values (3, 'dai', 2);
    17. delete from t_group where id=2; --错误,从表中有相关引用,因此主表中无法删除
    18. update t_group set id=2 where id=1; --错误,从表中有相关引用,因此主表中无法修改
    禁止方式create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete no action on update no action);参照完整性测试insert into t_user values (1, 'qianxin', 1); --可以插入insert into t_user values (2, 'yiyu', 2);    --可以插入insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符约束方式测试insert into t_user values (1, 'qianxin', 1);insert into t_user values (2, 'yiyu', 2);insert into t_user values (3, 'dai', 2);delete from t_group where id=2;              --错误,从表中有相关引用,因此主表中无法删除update t_group set id=2 where id=1;          --错误,从表中有相关引用,因此主表中无法修改
    展开全文
  • 约束(如外键约束、主键约束)这种东西在user_objects中是查不到,因为约束(如外键约束、主键约束)这种东西不属于数据库对象(object)这一范围。那么属于数据库对象(object)这一范围又是哪些种东西呢?这个...

           约束(如外键约束、主键约束)这种东西在user_objects中是查不到的,因为约束(如外键约束、主键约束)这种东西不属于数据库对象(object这一范围。那么属于数据库对象(object这一范围又是哪些种东西呢?这个可以查看如视图ALL_OBJECTS等里的OBJECT_TYPE字段,它表示为  Type of the object (such as TABLE, INDEX)。

           那约束和数据库对象的区别在哪里?

           约束只有定义该约束的(数据库)元数据,约束这种东西里面没有存放信息数据(表存放的是业务数据,索引存放的是与表相关的数据)。而数据库对象,比如表,除了有定义该表的(数据库)元数据外,表这种东西里面还存放了业务数据,就是数据行。正因为数据库对象里面存放了数据,所以可以对数据库对象进行插入或是删除、修改数据的这些操作(DML)。故而可以用能否对其进行插入或是删除、修改数据的这些操作(DML),来区别是否是数据库对象。

        例如,

    create table  lesson (lesson_name varchar2(20),classroom varchar2(10),constraint pk_lessonprimary key(lesson_name);

    表已创建。

    create table teacher(namevarchar2(20),lesson_name varchar2(20),constraintfk_lessonname foreign key(lesson_name)  references lesson(lesson_name);

    表已创建。

    insert into lessonvalues(’english’,’class 1’);
    已创建 1 行。

       其中,

    constraint pk_lessonprimary key(lesson_name 是主键pk_lesson的元数据(即定义);

    constraintfk_lessonname foreign key(lesson_name)  references lesson(lesson_name是主键fk_lessonname的元数据(即定义);

     

    create table lesson(lesson_namevarchar2(20), classroom varchar2(10))是表lesson的元数据(即定义);

    create tableteacher(name varchar2(20),lesson_name varchar2(20))是表 teacher的元数据(即定义)。

     

    insert into lessonvalues(’english’,’class 1’);里的’english’和’class 1’是插入表lesson里的数据。

     

         类似约束这样只有定义没有数据的东西,还有比如存储过程、函数等。

     

    参考:

    在Oracle数据字典中查看约束信息

     

    ALL_OBJECTS

     

    OBJECT_ID

    NUMBER

    NOT NULL

    Dictionary object number of the object

    DATA_OBJECT_ID

    NUMBER

     

    Dictionary object number of the segment that contains the object

     

     

     

    Note: OBJECT_ID and DATA_OBJECT_ID display data dictionary metadata. Do not confuse these numbers with the unique 16-byte object identifier (object ID) that Oracle Database assigns to row objects in object tables in the system.

     

    附加:

    查看如视图ALL_OBJECTS等里的OBJECT_TYPE字段后,发现存储过程、函数也是OBJECT_TYPE字段的值,即存储过程、函数也是数据库对象,这样的话,只能说有些数据库对象(比如表可以存放数据,有些不可以,如存储过程、函数等。

    那约束和数据库对象的区别在于什么?应该说,约束是以索引等数据库对象为实现手段的一种(概念)对象【比如,主键的本质是一个索引】,故而在逻辑上,是位于数据库对象上一层的对象。


    展开全文
  • mysql数据库中对字段约束里存在主键约束,也存在唯一键约束,这两种约束很容易出现混淆的情况,这里讲一下两个的区别: 主键唯一键的对比: 约束 保证唯一性 是否为空 一个表中有多少个 是否允许...

    mysql数据库中对字段的约束里存在主键约束,也存在唯一键约束,这两种约束很容易出现混淆的情况,这里讲一下两个的区别:

    主键和唯一键的对比:

    约束 保证唯一性 是否为空 一个表中有多少个 是否允许组合
    主键 至多一个 是(但不推荐)
    唯一键 可以为多个 是(但不推荐)

    这里顺便说一下外键几点注意:

    1、要求在从表设置外键关系

    2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求

    3、主表中的关联列必须是一个key(一般是主键,或者是唯一键)

    4、插入数据时先插入主表,再插入从表,删除数据时,先删除从表,再删除主表

     

    修改表时添加约束

    1、添加列级约束

    alter table 表名 modify column 字段名 字段类型  新约束;

    2、添加表级约束

    alter table 表名 add 【constarint 约束名】约束类型(字段名)【外键的引用 references  table (要关联的主表字段)】

    修改表时删除约束

    1、删除列级约束

    alter table 表名 modify column 字段名 (去掉要删除的约束,剩下的保留即可)

    2、删除表级约束

    alter table 表名 drop 约束名

     

    总结:列级约束和表级约束的不同

    约束名 位置 支持的约束类型 是否可以起约束名
    列级约束: 列的后面 语法都支持,但是外键没有效果 不可以
    表级约束: 所有列的下面 默认和非空不支持,其他直持 可以,主键没有效果
    展开全文
  • SQL:认识数据库约束

    千次阅读 热门讨论 2014-07-22 21:04:13
    讲了关于数据库的很多内容,也讲了很多约束,对唯一主键、核查规则、外键约束很感兴趣。 一、唯一主键(实体完整性) 区别: 数量:一张表只可以有一个主键约束,却可以有多个唯一约束。 是否空值:主键不...
  • Mysql数据库学习笔记

    2020-10-12 21:34:30
    添加表时添加唯一约束修改表时添加唯一约束删除唯一约束主键约束和唯一约束的区别:默认约束创建表时添加约束修改表的时候添加约束删除默认约束外键约束使用外键约束创建表时添加外键约束修改表时添加外键约束外键...
  • 另一个是关系部分,利用数据表把数据按行形式组织起来,检查每个字段的数据类型、长度甚至取值范围,利用外键约束数据表之间关系,利用事务机制确保数据库操作 ACID 特性。非关系型数据库全部或者部分放弃...
  • 多表查询 SELECT * FROM 表A,表B ...内外连接的区别 一.多表查询之内连接查询 概念 显示内连接隐式内连接只有语法外表的不同,其逻辑是没有区别的** 方式1:隐式内连接 格式: SELECT * FROM 表A,表B...
  • 约束

    2011-11-18 12:02:49
    约束的作用就是减少输入错误保证数据库数据的完整性,可以对字段设置约束。...Unique约束与主键的区别:Unique约束可以输入NULL值,主键不能,在一个表中,可以定义多个Unique约束字段,但是主键只能有
  • 表记录的操作2.1 字段约束2.2 drop、delete、truncate之间的区别?3. MySql常见的函数4. 外键和表关系4.1 外键介绍4.2 添加外键4.3 表关系4.4 关联查询、外连接查询1. MySql数据类型1.1 数值类型MySql中有很多数值...
  • 不幸是,虽然关系型数据库历经了约30年发展,有成熟理论大量实践基础,但是,大多数设计、开发人员在设计数据库结构时仍然是“跟着感觉走”,根据业务需要编程方便,把字段这张表放几个那张表放几个...
  • 表记录的操作2.1 字段约束2.2 drop、delete、truncate之间的区别?3. MySql常见的函数4. 外键和表关系4.1 外键介绍4.2 添加外键4.3 表关系4.4 关联查询、外连接查询 1. MySql数据类型 1.1 数值类型 MySql中有很多...
  • DOS下打开数据库:MySQL -h ip地址 -u密码 -p 使用 show databases 命令时 ;/g /G 其中最后一个友好...存在依赖关系子表父表之间联合查询,即主键或外键字段 设置唯一完整性约束的字段 desc table-name ; 查
  • typora-copy-images-to: images ...了解外键的约束作用; 掌握主键冲突的两种解决方案; 1.2 数据类型 MySQL中的数据类型是强类型 1.2.1 数值型 1、 整型 整形 占用字节数 范围 tinyint .
  • oracle数据库经典题目

    2011-02-17 15:05:20
    12.根据约束作用域,约束可以分为表级约束和列级约束两种。列级约束是字段定义一部分,只能够应用在一个列上;而表级约束定义独立于列定义,它可以应用于一个表中多个列。 13.填写下面语句,使其可以为...
  • MongoDB

    2019-03-21 09:37:00
    MongoDB是一个文件型数据库,介于关系型数据库和非关系型数据库之间,他我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,没有主外键约束,没有存储的数据类型约束。 Collection...
  • 5.1 数据表基本操作

    2020-01-18 15:30:43
    uniqueprimary key的区别 一个表中可以有多个字段声明为u’nique,但只能有primary key声明; 声明为primary key的列不允许有空值,但是声明为unique的字段允许空值得的存在。 1数据库 创建数据库 ...
  • MongoDB操作详解

    2018-09-17 15:49:01
    MongoDB我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等 关系型数据库中有一个“表”的概念,有“字段”的概念呢,有“行...
  • mongoDB操作详细

    2018-08-23 15:34:00
    我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等 关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的...
  • 归根结底,造成它原因是最近几年信息化进程飞速发展,导致了很多系统用户数量猛增,数据库中存储数据量亦成几何级数激增,数据库作为数据处理存储最终受体,将必然直接承担这种变化导致性能下降。...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    保存在oracle数据库所有操作细节: spool oracleday01.txt :开始记录 spool off :开始保存细节 四、SELECT语句:选择操作、投影操作。 select:从一个或多个表中检索一个或多个数据列。包含信息:想选择...
  • 然后这是学生成绩表,其中定义了外键约束 [sql] view plain copy create table GRADE( STU_ID INT NOT NULL, STU_SCORE INT, foreign key(STU_ID) references STUDENT(STU_ID) ); insert into GRADE values...
  • 键、甚至外键的外键) 运行语句 “schema [user.]objectName[@dbLink]”,如果是一表名或视图名或物化视图 (快照),则显示其生成的脚本/语句 支持 PL/SQL 语句(包括 Procedure、 Function、Trigger、 Package)...
  • c++ 面试题 总结

    2009-09-16 08:44:40
    说明上面三种描述的区别; 如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。 (1)const char *p 一个...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

数据库字段外键约束和外键的区别