精华内容
下载资源
问答
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性两个表必须是InnoDB表,MyISAM表...

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

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

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

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

    创建外键语法:

    代码如下 复制代码[CONSTRAINT [symbol]] FOREIGN KEY

    [index_name](index_col_name, ...)REFERENCEStbl_name (index_col_name,...)[ON DELETE reference_option]

    [ON UPDATE reference_option]reference_option:RESTRICT | CASCADE | SET NULL |NO ACTION

    如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ONUPDATE,默认的动作为RESTRICT:1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATECANSCADE都被InnoDB所支持。2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SETNULL都被InnoDB所支持。3. NO ACTION: InnoDB拒绝删除或者更新父表。4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。5. SET DEFAULT: InnoDB目前不支持。

    外键约束使用最多的两种情况:1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

    前一种情况,在外键定义中,我们使用ONUPDATE CASCADE ON DELETE RESTRICT;

    后一种情况,可以使用ONUPDATE CASCADE ON DELETE CASCADE。

    使用案例:

    (1)创建表:

    代码如下 复制代码--

    --http://www.111cn.net 原创--

    CREATE TABLE IF NOT EXISTS`article` (

    `id`int(11) NOT NULLAUTO_INCREMENT,

    `category_id`int(11) NOT NULL,

    `name`char(16) NOT NULL,PRIMARY KEY(`id`),KEY`fk_1` (`category_id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;INSERT INTO `article` (`id`, `category_id`, `name`) VALUES(1, 1, '文章1');CREATE TABLE IF NOT EXISTS`category` (

    `id`int(11) NOT NULLAUTO_INCREMENT,

    `name`char(16) NOT NULL,PRIMARY KEY(`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;INSERT INTO `category` (`id`, `name`) VALUES(1, '分类1');

    创建外键约束:

    代码如下 复制代码ALTER TABLE`article`ADD CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES`category` (`id`);

    (2)删除主表category中数据:delete FROM `category` WHERE id=1,会报错:

    #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES`category` (`id`))

    (3)从表article中,添加不存在的category_id:insert into article(category_id,name) values(2,'分类2') 会报错:

    #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES`category` (`id`))

    (4)更改更新删除约束

    代码如下 复制代码--删除外键

    ALTER TABLE article DROP FOREIGN KEYfk_1--添加外键

    ALTER TABLE `article` ADD CONSTRAINT `fk_1` FOREIGN KEY( `category_id` )REFERENCES`category` ( `id` )ON DELETE CASCADE ON UPDATE CASCADE此时如下操作:

    代码如下 复制代码--此时article中的记录也会被删除

    delete from category where id=1;--此时article中的category_id也会被更新成3

    UPDATE `test`.`category` SET `id` = '3' WHERE `category`.`id` =2;

    展开全文
  • 如果mysql报错:Error Code: 1215. Cannot add foreign key constraint ...外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加...

    如果mysql报错:Error Code: 1215. Cannot add foreign key constraint (foreign keys)

    检查 主从表两个字段的属性是否一致

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

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

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

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

    创建外键语法:

    代码如下 复制代码

    [CONSTRAINT [symbol]] FOREIGN KEY

    [index_name] (index_col_name, ...)

    REFERENCES tbl_name (index_col_name,...)

    [ON DELETE reference_option]

    [ON UPDATE reference_option]

    reference_option:

    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 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。

    使用案例:

    (1)创建表:

    代码如下 复制代码

    --

    -- http://www.111cn.net 原创

    --

    CREATE TABLE IF NOT EXISTS `article` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `category_id` int(11) NOT NULL,

    `name` char(16) NOT NULL,

    PRIMARY KEY (`id`),

    KEY `fk_1` (`category_id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

    INSERT INTO `article` (`id`, `category_id`, `name`) VALUES

    (1, 1, '文章1');

    CREATE TABLE IF NOT EXISTS `category` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `name` char(16) NOT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

    INSERT INTO `category` (`id`, `name`) VALUES

    (1, '分类1');

    创建外键约束:

    代码如下 复制代码

    ALTER TABLE `article`

    ADD CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`);

    (2)删除主表category中数据:delete FROM `category` WHERE id=1,会报错:

    #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`))

    (3)从表article中,添加不存在的category_id:insert into article(category_id,name) values(2,'分类2') 会报错:

    #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`))

    (4)更改更新删除约束

    代码如下 复制代码

    --删除外键

    ALTER TABLE article DROP FOREIGN KEY fk_1

    --添加外键

    ALTER TABLE `article` ADD CONSTRAINT `fk_1` FOREIGN KEY ( `category_id` )

    REFERENCES `category` ( `id` )

    ON DELETE CASCADE ON UPDATE CASCADE

    此时如下操作:

    代码如下:

    --此时article中的记录也会被删除

    delete from category where id=1;

    --此时article中的category_id也会被更新成3

    UPDATE `test`.`category` SET `id` = '3' WHERE `category`.`id` =2;

    展开全文
  • 外键约束是表一个特殊字段,经常与主键约束一起使用。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键。(推荐学习:mysql教程)具体语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]...

    mysql外键约束的写法:【[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1】。外键约束是表的一个特殊字段,经常与主键约束一起使用。

    aec2349a47212b6d6d9f3314f2f804a8.png

    在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键。

    (推荐学习:mysql教程)

    具体的语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]

    REFERENCES 主键列1 [,主键列2,…]

    MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。

    对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

    定义外键时,需要遵守下列规则:主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。必须为主表定义主键。

    主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

    在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

    外键中列的数目必须和主表的主键中列的数目相同。

    外键中列的数据类型必须和主表主键中对应列的数据类型相同。

    举例:

    为了展现表与表之间的外键关系,本例在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下表所示。

    bb73865851a11457baba284d73de08fa.png

    创建 tb_dept1 的 SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_dept1

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(22) NOT NULL,

    -> location VARCHAR(50)

    -> );

    Query OK, 0 rows affected (0.37 sec)

    创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptId 作为外键关联到表 tb_dept1 的主键 id,SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_emp6

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT,

    -> CONSTRAINT fk_emp_dept1

    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)

    -> );

    Query OK, 0 rows affected (0.37 sec)

    mysql> DESC tb_emp6;

    +--------+-------------+------+-----+---------+-------+

    | Field | Type | Null | Key | Default | Extra |

    +--------+-------------+------+-----+---------+-------+

    | id | int(11) | NO | PRI | NULL | |

    | name | varchar(25) | YES | | NULL | |

    | deptId | int(11) | YES | MUL | NULL | |

    | salary | float | YES | | NULL | |

    +--------+-------------+------+-----+---------+-------+

    4 rows in set (1.33 sec)

    以上语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。

    注意:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如,两者都是 INT 类型,或者都是 CHAR 类型。如果不满足这样的要求,在创建从表时,就会出现“ERROR 1005(HY000): Can't create table”错误。

    展开全文
  • 外键约束是表一个特殊字段,经常与主键约束一起使用。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键。(推荐学习:mysql教程)具体语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]...

    mysql外键约束的写法:【[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1】。外键约束是表的一个特殊字段,经常与主键约束一起使用。

    a234a32fac54ab1395c8790befb358c8.png

    在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键。

    (推荐学习:mysql教程)

    具体的语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]

    REFERENCES 主键列1 [,主键列2,…]

    MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。

    对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

    定义外键时,需要遵守下列规则:主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。必须为主表定义主键。

    主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

    在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

    外键中列的数目必须和主表的主键中列的数目相同。

    外键中列的数据类型必须和主表主键中对应列的数据类型相同。

    举例:

    为了展现表与表之间的外键关系,本例在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下表所示。

    77a6e258bca98c76d862685cb72d8f96.png

    创建 tb_dept1 的 SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_dept1

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(22) NOT NULL,

    -> location VARCHAR(50)

    -> );

    Query OK, 0 rows affected (0.37 sec)

    创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptId 作为外键关联到表 tb_dept1 的主键 id,SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_emp6

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT,

    -> CONSTRAINT fk_emp_dept1

    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)

    -> );

    Query OK, 0 rows affected (0.37 sec)

    mysql> DESC tb_emp6;

    +--------+-------------+------+-----+---------+-------+

    | Field | Type | Null | Key | Default | Extra |

    +--------+-------------+------+-----+---------+-------+

    | id | int(11) | NO | PRI | NULL | |

    | name | varchar(25) | YES | | NULL | |

    | deptId | int(11) | YES | MUL | NULL | |

    | salary | float | YES | | NULL | |

    +--------+-------------+------+-----+---------+-------+

    4 rows in set (1.33 sec)

    以上语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。

    注意:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如,两者都是 INT 类型,或者都是 CHAR 类型。如果不满足这样的要求,在创建从表时,就会出现“ERROR 1005(HY000): Can't create table”错误。

    展开全文
  • 外键约束的使用示例

    2014-05-12 16:09:54
    如果表A关键字是表B中字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性。 比如说: create table t_group (   id int not null,   name varchar(30),   ...
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性两个表必须是InnoDB表,MyISAM表...
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性 两个表必须是InnoDB表,MyISAM...
  • MySQL外键约束(FOREIGN KEY)用来在两个表数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。 1、在创建表时设置外键约束 在数据表中创建外键使用 FOREIGN KEY 关键字 语法 [CONSTRAINT <...
  • 外键约束是表一个特殊字段,经常与主键约束一起使用。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键。(推荐学习:mysql教程)具体语法格式如下:MySQL 外键约束(FOREIGN KEY)是表一个特殊字段,...
  • MySQL外键&外键约束

    2019-02-15 10:13:35
    外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性 外键  使用条件: 表存储...
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性 。 Mysql使用外键条件: ...
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性 两个表必须是InnoDB表,MyI...
  • MYSQL外键约束

    2016-12-20 16:08:00
    Mysql外键约束设置[Mysql外键使用详细教程] 转载请注明地址:http://www.phpddt.com/db/mysql-foreign-key.html尊重他人劳动成果就是尊重自己! http://www.phpddt.com/db/mysql-foreign-key.html 外键概念:...
  • mysql主键约束主键(PRIMARY KEY)完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快查找到表中记录,都会在表中设置一个主键。1、在创建表时设置主键约束在 CREATE ...
  • 主键约束:创建表时,在列类型后页面可以用PRIMARY KEY关键字... 创建主键建议方法:在列或者表级别使用CONSTRAINT关键字,为约束指定一个约束名,一般CONSTRANIT后面是约束名。 列级别主键约束定义语法:invo...
  • 外键约束是表一个特殊字段,经常与主键约束一起使用。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键。()具体语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES 主键列1 ...
  • 用来唯一标识数据库中的每一条记录,主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。 主键关键字:primary key 主键的特点: 非空且唯一 在创建表的时候给...
  • mysql中设置外键约束的方法:可以通过FOREIGN KEY关键字来指定外键,语法“ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(列名) REFERENCES 主表名 (列名);”。(1) 外键的使用:外键作用,主要有两个:一个是...
  • MySQL外键使用详解

    2020-12-15 17:17:05
    (1)只有InnoDB类型表才可以使用外键,mysql默认是MyISAM,这种类型不支持外键约束 (2)外键好处:可以使得两张表关联,保证数据一致性和实现一些级联操作; (3)外键作用: 保持数据一致性,完整性,...
  • 什么是MySQL的外键

    2020-10-24 16:35:51
    以另一个关系的外键作主关键字的表被称为主表,具有此外键表被称为主表从表。 保持数据一致性,完整性,主要目的是控制存储在外键表中数据,约束。使两张表形成关联,外键只能引用外表中值或使用空值。 ...
  • 当向有外键关联的表中添加数据时可能就会出现违反完整约束、未找到父项关键字,查看外键关联的表时发现你要使用的数据是存在的,原因就是数据库存在的数据有问题,本人提供的方法的是查询出有问题的数据,希望可以帮...
  • 在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreignkey)。 1.2外键的作用: 保持数据一致性,完整性...
  • 约束条件分为以下几种: 1)非空约束,使用NOT NULL关键字;...6)外键约束使用FOREIGN KEY关键字。 约束是确保数据完整性,从而阻止不希望插入数据被录入。 以下使用一段SQL代码进行演示...
  • MySQL 外键约束(FOREIGN KEY)是表一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系表而言,相关联字段中主键所在表就是主表(父表),外键所在表就是从表(子表)。外键用来建立...

空空如也

空空如也

1 2 3 4 5 6
收藏数 109
精华内容 43
关键字:

外键约束使用的关键字是