精华内容
下载资源
问答
  • 我们可以在创建表时设置外键约束。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES 主键列1 [,主键列2,…]举例:...

    5ee9b49e1eb32493.jpg

    我们可以在创建表时设置外键约束。

    在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]

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

    举例:

    现在在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下图所示:

    1592374540945822.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”错误。

    展开全文
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性两个表必须是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为例,总结一下3种外键约束方式区别和联系。这里以用户表...

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

    这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。

    首先创建用户组表:

    Sql代码

    create table t_group (

    id int not null,

    name varchar(30),

    primary key (id)

    );

    create table t_group (id int not null,name varchar(30),primary key (id));

    并插入两条记录:

    Sql代码

    insert into t_group values (1, 'Group1');

    insert into t_group values (2, 'Group2');

    insert into t_group values (1, 'Group1');insert into t_group values (2, 'Group2');

    下面创建用户表,分别以不同的约束方式创建外键引用关系:

    1、级联(cascade)方式

    Sql代码

    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

    );

    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代码

    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', 3); --错误,无法插入,用户组3不存在,与参照完整性约束不符

    约束方式测试

    Sql代码

    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

    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代码

    置空方式

    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被设置为NULL

    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代码

    禁止方式

    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;          --错误,从表中有相关引用,因此主表中无法修改

    展开全文
  • 我们可以在创建表时设置外键约束。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES 主键列1 [,主键列2,…]举例:...

    a894b7fed64398805dce0ce0f75e4a31.png

    我们可以在创建表时设置外键约束。

    在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]

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

    举例:

    现在在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下图所示:

    64d44e94da7e7f111415d61438be8e61.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”错误。

    展开全文
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式区别和联系。这里以用户表...
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式区别和联系。这里以用户表...
  • 主键约束创建表时,在列类型后页面可以用PRIMARY KEY关键字指定列类型为主键,当指定列类型为主键后,列被强制为NOT NULL,并且列中每行被强制为一个唯一值。 创建主键建议方法:在列或者表级别使用...
  • 我们可以在创建表时设置外键约束。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体语法格式如下:...创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它键 deptId 作为外键关联到表 t...
  • 有2个表,A和B A我创建主键约束是这样的 CONSTRAINT tab_t_pk PRIMARY KEY (tab_col1,tab_col2) B表我建立外键约束的是 CONSTRAINT tab_t_fk FOREIGN KEY (tab_col1) REFERENCES A(tab_col1) 创建b表的外键约束时,...
  • MySQL外键约束(FOREIGN KEY) 简介 MySQL外键约束(FOREIGN KEY)用来在两个...在数据表中创建外键使用 FOREIGN KEY 关键字 语法 [CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <...
  • 外键是用来实现参照完整性,不同外键不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。CASCADE: 从父表删除或更新且自动删除或更新子表中匹配...
  • 外键约束

    2015-02-02 14:09:44
    外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。这里以MySQL5.5为例,总结一下3种外键约束方式区别和联系。  这里以...
  • 报错情况1: Error 1005:Can't create table(errno:150) 原因:由于主表好应用表的外键...原因:外键字段关键字重复引用(注意:一个外键只可以关联一张表“类比一个USB接口只可以连接一台手机”) 报错情况3:
  • Mysql外键约束

    千次阅读 热门讨论 2016-04-10 20:05:40
    外键是用来实现参照完整性,不同外键不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。  CASCADE: 从父表删除或更新
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式区别和联系。这里以用户表...
  • 外键约束的三种方式

    2016-12-09 15:30:00
    外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式区别和联系。 这里以用户...
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式区别和联系。  这里以...
  • mysql 设置外键约束(foreign key)

    万次阅读 2015-02-06 13:43:13
    如果需要对多个列组合创建外键约束,或者需要为外键约束指定名字则必须使用表级约束语法。  使用列级约束语法建立外键约束直接使用references关键字,references指定该列参照哪个主表,以及参照主表哪一列。...
  • 在mysql设计表中,有个概念叫做约束什么是约束约束英文:constraint约束实际上就是表中数据限制条件约束种类mysql约束大概分为以下几种:非空约束(not null)唯一性约束(unique)主键约束(primary key) PK外键约束...
  • mysql三种外键约束方式

    千次阅读 2018-04-26 13:52:19
    外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式区别和联系。这里以用户表...
  • 添加外键约束时需要注意地方

    千次阅读 2014-09-25 19:45:21
    添加外键约束的时候,报了这么一个错误“ORA-02270: 此列列表的唯一关键字或主键不匹配”。如下图: 检查了好几遍都没有发现语法错误。最后根据Oracle的提示还是找到了原因:被引用的那个外键,必须是添加了...
  •  外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。  这里以MySQL为例,总结一下3种外键约束方式区别和联系。  ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

创建外键约束的关键字