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

    2021-01-05 22:33:40
    外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 ...

    外键约束

    • 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)

    • 在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)

    • 删除外键语法: alter table 从表表名 drop foreign key 外键名称;

    • 级联操作:

      • 注意:

        在从表中,修改关联主表中不存在的数据,是不合法的

        在主表中,删除从表中已经存在的主表信息,是不合法的。直接删除主表(从表中有记录数据关联) 会包删除失败。

      • 概念: 在修改或者删除主表的主键时,同时它会更新或者删除从表中的外键值,这种 动作我们称之为级联操作。

      • 语法:

        • 更新级联 on update cascade 级联更新 只能是创建表的时候创建级联关系。当更新主表中的主键,从表中的外键字段会同步更新。
        • 删除级联 on delete cascade 级联删除 当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
      • 操作:

        -- 给从表student添加级联操作
        create table student(
            s_id int PRIMARY key ,
            s_name VARCHAR(10) not null,
            s_c_id int,
        -- constraint  外键约束名称  foreign key(外键的字段名称)  references 主表表名(主键字段名)
        	 CONSTRAINT	stu_cour_id FOREIGN key(s_c_id)	REFERENCES	course(c_id)				-- 给s_c_id 添加外键约束
        	 ON UPDATE CASCADE	ON DELETE CASCADE
        )
        
        insert into student VALUE(1,'小孙',1),(2,'小王',2),(3,'小刘',4);
        insert into student VALUE(4,'小司马',1),(5,'小赵',1),(6,'小钱',1);
        
        -- 查询学生表中的记录
        select * from student;
        
        -- 级联操作。
        -- 更新级联  on update cascade   级联更新 只能是创建表的时候创建级联关系。当更新主表中的主键,从表中的外键字段会同步更新。
        update course set c_id = 10 where c_id = 1;
        -- 删除级联  on delete cascade   级联删除  当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
        
        delete from course where c_id = 10;
        

    约束总结

    约束名 关键字 描述
    主键 primary key 唯一不为空
    默认 default 插入数据,该字段没有赋值,系统会自动赋指定的默认值
    非空 not null 该字段不能为null(空)
    唯一 unique 该字段的值在整个表中只能出现1次
    外键 foreign key 从表中添加外键字段,关联主表中的主键字段
    展开全文
  • 1、约束简介: (1)、约束保证了数据的完整性和一致性; (2)、约束分为表级约束和列级约束; (3)、约束的类型包括 ...FOREIGN KEY(FK, 外键约束)2、外键约束说明: (1)、父表和子表必须使用相同的存储

    1、约束简介:
    (1)、约束保证了数据的完整性和一致性;
    (2)、约束分为表级约束和列级约束。
    其中,表级约束是指对多个数据列建议的约束,它只能在列定义后声明。
    列级约束是指多一个数据列建立的约束,它可以在定义列的时候声明,也可以在列定义好以后声明。
    (3)、约束的类型包括
    NOT NULL(NN,非空约束)、
    PRIMARY KEY(PK, 主键约束)、
    UNIQUE KEY(UN, 唯一约束)、
    DEFAULT(DE,默认约束)、
    FOREIGN KEY(FK, 外键约束)

    2、外键约束说明:
    (1)、父表和子表必须使用相同的存储引擎,如InnoDB等,而且禁止使用临时表;
    (2)、支持外键约束的数据表存储引擎只能是InnoDB;
    (3)、外键列(字段)和参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同,而字符类型的字段的长度则可以不同;
    (4)、外键列(字段)和参照列(即外键列在另一个表中对应的主键列)必须创建索引,如果外键不存在索引(即外键约束)的话,MySQL将自动给外键列自动创建索引(外键约束)

    外键约束使用案例,其中主键列(主表/父表)是province表,外键列(子表)是user表;
    主表:province表
    外键约束,子表:user表
    注意:province表中的id列,在province表中是主键列。user表中的pid列,在user表中是外键列,但是与province表中的id列一一对应,REFERENCES province(id),所以,user表中的pid字段的数据类型,是否UNSIGNED要与province表中的id字段对应好,对于非字符类型的字段,则要求字段类型以及各种约束都要完全相同。

    展开全文
  • MySQL外键约束

    2021-06-16 14:22:05
    只有InnoDB的引擎才支持外键。 从表的外键必须是主表的唯一性索引,主键和外键的字段类型要相似,数值型类型要求一致,无符号也要要求一致,字符型长度可以不同,类型需要一致。 如果外键字段没有创建索引,...

        外键的使用条件:

        两个表必须是InnoDB表,MyISAM表暂时不支持外键

        外键列必须建立了索引,MySQL4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;

        外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

        外键可以在创建表的时候添加,也可以在创建表之后修改。

    -- 建表时指定外键
    -- 部门表
    CREATE TABLE dep (
        id int(11) NOT NULL AUTO_INCREMENT COMMENT '部门id',
        depName varchar(50) NOT NULL COMMENT '部门名称',
        description varchar(50) NOT NULL DEFAULT '' COMMENT '部门描述',
        PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门表';
    
    -- 职工表
    CREATE TABLE emp (
      id int(11) NOT NULL AUTO_INCREMENT COMMENT '职工id',
      name varchar(50) NOT NULL COMMENT '职工名称',
      sex set('男','女','保密') NOT NULL DEFAULT '保密' comment '性别',
      depId int(11) NOT NULL COMMENT '部门id',
      PRIMARY KEY (id),
      KEY fk_depid (depId),
      CONSTRAINT fk_depid FOREIGN KEY (depId) REFERENCES dep (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='职工表';

        动态创建外键

        通过ALTER命令可以动态添加和删除外键,命令如下,需要注意的是,在动态添加外键前,从表中不能有脏值,否则不能添加成功。

    -- 建表后增加外键
    ALTER TABLE `emp` CONSTRAINT `fk_depid` FOREIGN KEY (`depId`) REFERENCES `dep` (`id`);
    -- 删除外键
    ALTER TABLE `emp` DROP FOREIGN KEY `fk_depid`;

        外键约束的参考操作

        CASCADE

        在父表上update/delete记录时,同步update/delete掉子表的匹配记录

        SET NULL

        主表删除或者更新,并设置从表的外键值为NULL,但是需要保证外键可以允许为NULL(即从表外键列不能为NOT NULL),否则添加这个约束会失败。

        NO ACTION

        如果子表中有匹配的记录,则不允许对主表进行update/delete操作

        RESTRICT

        同no action,都是立即检查外键约束。

        SET NULL

        父表有变更时,子表将外键列设置成一个默认的值但InnoDB不能识别

        NULL、RESTRICT、NO ACTION

        删除:从表记录不存在时,主表才可以删除。删除从表,主表不变

        更新:从表记录不存在时,主表才可以更新。更新从表,主表不变

        CASCADE

        删除:删除主表时自动删除从表。删除从表,主表不变

        更新:更新主表时自动更新从表。更新从表,主表不变

        SET NULL

        删除:删除主表时自动更新从表值为NULL。删除从表,主表不变

        更新:更新主表时自动更新从表值为NULL。更新从表,主表不变

        外键约束属性:RESTRICT | CASCADE | SET NULL | NO ACTION

        如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT。

        1、CASCADE:从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

        2、SET NULL:从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET NULL都被InnoDB所支持。

        3、NO ACTION:InnoDB拒绝删除或者更新父表。

        4、RESTRICT:拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。

        5、SET DEFAULT:InnoDB目前不支持。

        外键约束使用最多的两种情况无外乎:

        1、父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

        2、父表更新时子表也更新,父表删除时子表匹配的项也删除。

        前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

        当执行外键检查之时,InnoDB对它照看着的子或父记录设置共享的行级锁。InnoDB立即检查外键约束,检查不对事务提交延迟。

        要使得对有外键关系的表重新载入转储文件变得更容易,mysqldump自动在转储输出中包括一个语句设置FOREIGN_KEY_CHECKS为0。这避免在转储被重新装载之时,与不得不被以特别顺序重新装载的表相关的问题。也可以手动设置这个变量:

        mysql> SET FOREIGN_KEY_CHECKS=0;

        mysql> SOURCE dump_file_name;

        mysql> SET FOREIGN_KEY_CHECKS=1;

        如果转储文件包含对外键是不正确顺序的表,这就以任何顺序导入该表。这样也加快导入操作。设置FOREIGN_KEY_CHECKS为0,对于在LOAD DATA和ALTER TABLE操作中忽略外键限制也是非常有用的。

        InnoDB不允许你删除一个被FOREIGNKEY表约束引用的表,除非你做设置SETFOREIGN_KEY_CHECKS=0。当你移除一个表的时候,在它的创建语句里定义的约束也被移除。

        如果你重新创建一个被移除的表,它必须有一个遵从于也引用它的外键约束的定义。它必须有正确的列名和类型,并且如前所述,它必须对被引用的键有索引。如果这些不被满足,MySQL返回错误号1005并在错误信息字符串中指向errno 150。

    展开全文
  • 外键约束和表关系

    2021-03-10 16:54:59
    表关系数据存储问题:外键约束外键特点基础语法表和表之间的关系1对11对多,多对1多对多自关联 今天主要总结一下关于mysql中表和表之间的关系和约束语法 数据存储问题: 数据冗余 引发问题: 增删改异常和数据...


    今天主要总结一下关于mysql中表和表之间的关系和约束语法

    数据存储问题:

    • 数据冗余

    • 引发问题:
      增删改异常和数据异常
      解决方案:分表

    实际开发中,一个项目通常需要很多张表才能完成。

    外键约束

    有两张表“分类表”和“商品表”,为了表明商品属于哪个分类,通常情况下将在商品表上添加一列,用于存放分类cid的信息,此列称为外键

    分类表category称为主表,id称为主键

    商品表product称为从表,category_id称为外键

    在MySQL中只有innodb存储引擎才能支持主外键关联,MyISAM可以定义外键,但是系统不进行数据检查

    create table t_catalog(
    id bigint primary key auto_increment,
    Name varchar(32) not null
    )engine=innodb default charset utf8;
    
    Create table t_product(
    Id bigint primary key auto_increment,
    Title varchar(50) not null,
    Price numeric(8,2) default 0,
    Catalog_id bigint,  -- 用于表示商品所属的类别,这里的取值必须是t_catalog表中的id列上存在的数据,可以使用foreign key进行约束定义
    Foreign key(catalog_id) references t_catalog(id) on delete cascade
    )engine=innodb default charset utf8;
    

    注意:外键上没有非空约束,如果需要非空,则在定义列时添加非空约束,即Catalog_id bigint not null

    要求catalog_id的取值必须在t_catalog(id)中存在,否则报错

    通过主表的主键和从表的外键来描述主外键关系,呈现就是一对多关系

    外键特点

    从表外键的值是对主表主键的引用
    从表外键类型,必须与主表主键类型一致

    基础语法

    语法:alter table 从表 add constraint 约束名称 foreign key (从表外键列名称) references 主表 (主表的主键列名称);

    [外键名称]用于删除外键约束的,一般建议_fk结尾或者fk_开头

    举例:为student表添加外键约束。

    ALTER TABLE student ADD CONSTRAINT FK_ID FOREIGN KEY (gid) REFERENCES grade(id);
    

    语法:alter table 从表 drop foreign key 约束名称

    举例:删除student表中的外键约束

    ALTER TABLE student DROP FOREIGN KEY FK_ID;
    

    使用外键目的:保证数据参照完整性

    表和表之间的关系

    表和表之间的关系有3种:1:1 1:n或者n:1 n:m

    1对1

    示例:一夫一妻
    思考:在一个表中保存着所有人的信息。有男有女,要求查询出所有的夫妻,即一男一女。
    注意下面:王五是光棍不应该能查询出来

    表示方式有2种:
    唯一外键

    create table husband(   -- 主表
    Id bigint primary key,
    Name varchar(20) not null
    )engine=innodb default charset utf8;
    
    Create table wife(
    Id bigint primary key,
    Name varchar(20) not null,
    Hus_id bigint not null unique, -- 要求hus_id不允许重复
    Foreign key(hus_id) references husband(id) on delete cascade
    )engine=innodb default charset utf8;
    

    共享主键

    Create table student(
    Id bigint primary key auto_increment,
    NickName varchar(20) not null,
    ... ...
    )engine=innodb default charset utf8;
    
    Create table idcard(
    Id bigint primary key,
    Foreign key(id) references student(id) on delete cascade,
    .... ....
    )engine=innodb default charset utf8;
    

    1对多,多对1

    一个人可以拥有多辆汽车,要求查询出某人所拥有的所有汽车

    Create table person(
    Id bigint primary key auto_increment,
    Name varchar(20) not null, ....
    )engine=innodb default charset utf8;
    
    Create table car(    -- 多端含外键
    Id bigint primary key auto_increment,
    Brand varchar(32) not null,....
    Owner_id bigint not null,
    Foreign key(owner_id) references person(id) on delete cascade
    )engine=innodb default charset utf8;
    

    多对多

    一个人可以拥有多种角色,如某人,即是父亲、又是儿子、又是丈夫。而同时这三个角色又可以给其他所有的人

    在RDB中不能直接表达多对多关联,需要引入一个中间表

    Create table t_employee(
    Id bigin primary key,
    Name varchar(20) not null,
    ... ...
    )engine=innodb default charset utf8;	Create table 
    
    create table t_role(
       Id bigint primary key auto_increment,
       Title varchar(32) not null,
       ... ...
    )engine=innodb default charset utf8;
    
    Create table t_role_emp(
    Emp_id bigint not null,
    Role_id bigint not null,
    Primary key(emp_id,role_id),  -- 定义复合主键,保证两个列的组合不允许重复
    Foreign key(emp_id) references t_employee(id) on delete cascade,
    Foreign key(role_id) references t_role(id) on delete cascade
    )engine=innodb default charset utf8;
    

    自关联

    Create table t_catalog(
        Id bigint primary key auto_increment,
    Title varchar(32) not null, .... ....
    Parent_id bigint,
    Foreign key(parent_id) references t_catalog(id) on delete cascade
    )engine=innodb default charset utf8;
    
    展开全文
  • 约束 * 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。 * 分类: 1. 主键约束:primary key 2.... 3.... 4. 外键约束:foreign key * 非空约束:not null,值不能为null 1....
  • (二)表的连接与外键约束

    千次阅读 2015-08-10 20:35:29
    外键约束和表连接 【建立表的关系】 1.额外建立一张表描述两个表之间的关系,存储两张需要连接的表的主键对应关系。 2.利用外键约束 外键:一张表的某个字段引用着另一张表的主键,在数据多的表中多一个字段...
  • 外键约束的作用? 用来维护两个表之间的一致性关系. 如何起到这样的作用? 在从表中添加或更新外键时,必须先存在于主键表中,这就保证了两个表中相关数据的一致性. 转载于:...
  • 一、数据库中的约束 1.作用:为了保证数据的有效性和完整性 2.mysql常用的约束: ...外键约束foreign key 非负约束UNSIGNED ENUM 把一个字段的数据类型设为枚举型,也可以起到一种约束的效果 1.主键约束prim...
  • 问题描述:Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法: 在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新创建此表后,再把数据使用sql...
  •   关系数据库与NoSql其中的一个主要区别是具备完整的外键约束,虽说现在一些大厂在设计数据存储结构时禁止使用外键约束,靠业务逻辑来保证数据完整性,但考虑到是人就会犯错,为了保证关键业务数据的完整性,所以...
  •   关系数据库与NoSql其中的一个主要区别是具备完整的外键约束,虽说现在一些大厂在设计数据存储结构时禁止使用外键约束,靠业务逻辑来保证数据完整性,但考虑到是人就会犯错,为了保证关键业务数据的完整性,所以...
  • 列出给定表的主键、外键约束 需求描述 需求:查询出给定的表emp的外键约束信息。 解决方法:通过各个数据库里提供的与外键约束相关的数据字典进行查询。 注: 数据库数据集SQL脚本详见如下链接地址 员工表结构和...
  • 为了降低外键约束对数据库造成的性能影响,我们需要将外键删除,下文描述删除外键的工程。注:在互联网系统设计中尽量保持数据库表的原子性设计。一、查找创建外键的 sql 语句在 Activiti 中databaseSchemaUpdate...
  • 外键约束要求 一对多表关系 一对一表关系 多对多表关系 外键约束的参照操作 mysql 介绍 mysql是关系型数据库,关系数据库,是建立在关系模型基础上的数据库, 现实世界中...
  • 文章目录1、检查约束(check、ck)1.1 范例1:设置检查约束1.2 范例2:保存正确的数据1.3 范例3:保存错误的数据2、外键约束(foreign key、fk)2.1 范例1:初期设计 --不使用外键2.2 范例2:增加正确数据2.3 范例3:...
  • SQL中的外键约束及多表查询 外键约束 foreign key 实体:数据库中的表,就可以看作一个实体,实体和实体之间有一些关系 比如说做一个网上商城的项目,里面有用户表,商品表,订单表 一对多的关系:用户和订单 用户和...
  • t2:id,userid(外键,参照的为t1的userid) 默认属性:RESTRICT 一、插入 对t1而言(被参照的表)是没有任何影响的 对t2 而言,t2 的userid那一列的值一定要存在于t1的userid 那一栏中,不然插入不进去 ...
  • 一、约束的分类 1、实体约束 ... 若果某列的值必须与其他列的值匹配,那就意味着需要一个参照完整性约束,例如外键约束。 二、约束命名 1、系统创建约束名称  Sql Server我们不提供约束名称,会自动...
  • ORACLE外键约束

    2013-03-05 23:33:47
    子表、主表数据都导入完毕后, 再启用外键约束。   以下测试环境为 初始的创建表、初始数据的情况。   SQL> -- 创建外键(默认选项) SQL> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons ...
  • MySQL的外键约束之级联删

    千次阅读 2010-02-05 11:58:00
    如今,许多关系型数据库管理系统都提供了外键约束这一强大的功能特性,它能够帮助我们自动地触发指定的动作,诸如删掉、更新数据库表的记录等,从而维护各数据库表之间预定义的关系。本文将演示如何在MySQL中利用...
  • SQLite 外键约束删除不完整

    千次阅读 2019-05-22 08:56:48
    问题描述:使用SQLite删除具有约束关系的主表数据时,从表的数据没有删除!!! 解决方式:打开数据库后,需要执行语句:"PRAGMA foreign_keys = ON;" 即: sqlite3_exec(m_pSqlite3, "PRAGMA foreign_keys ...
  • 数据库三大范式/外键约束/外键级联

    千次阅读 2019-10-24 21:15:06
    -- 添加外键约束,并且添加级联更新和级联删除 CONSTRAINT employee_dep_fk FOREIGN KEY ( dep_id ) REFERENCES department ( id ) ON UPDATE CASCADE ON DELETE CASCADE ) ; 再次...
  • 1.外键约束 外键约束概念 使表和表之间产生联系,保证数据的准确性 为什么要有外键约束? 假如存在两张表,一张表为用户表,一张表为订单表。当用户表删除一个用户时,订单表中仍存在此用户的订单,所以需要...

空空如也

空空如也

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

外键约束的描述