外键:

定义:如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。

作用:外键是用来实现参照完整性的,不同的外键约束方式将可以是两张表紧密的结合起来。比如修改或者删除的级联操作等,外键主要用来保证数据的完整性和一致性。

条件:

1、创建外键的两个表,父表与子表必须是InnoDB存储引擎。

2、创建外键的时候,父表要创建索引,一般为主键索引。子表在创建外键的时候也必须要创建索引。

3、子表的外键必须和父表的主键数据类型相对应(字段的类型和值必须一样或者相似,比如int也可以对应tinyint)。

语法:

下面这个是在子表中操作的:

[CONSTRAINT Symbol] FOREIGN KEY [id](index_col_name,.....)REFERENCEStbl_name (index_col_name,...)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

其中Symbol仅仅是给约束自定义一个名称,方便以后我们删除约束。

RESTRICT和NO  ACTION相同,是指限制在子表有关联记录的情况下父表不能进行操作。比如:DELETE  RESTRICT表示主表在删除记录的时候,如果子表有对应的记录,则不允许删除。比如UPDATE  CASCADE表示主表在更新记录的时候,如果子表有对应的记录,则子表也更新。(其实更新的就是主键和外键的那一列的值)。

CASCADE:表示父表在更新或者删除时,也更新或者删除子表对应的记录。

SET  NULL:表示父表的更新或者删除的时候,那么子表对应的字段被会SET  NULL。

注意:当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。

例子:

首先是我们创建两个表,一个是父表,一个是字表。字表设置有参照约束。

mysql> create tablecountry(-> country_id smallint unsigned not nullauto_increment,-> country varchar(50) not null,-> last_update timestamp not null default current_timestamp on update current_timestamp,-> primary key(country_id)-> )engine=InnoDB default charset=utf8;

Query OK,0 rows affected (0.10sec)

mysql> desccountry;+-------------+----------------------+------+-----+-------------------+-----------------------------+

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

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

| country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |

| country | varchar(50) | NO | | NULL | |

| last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

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

3 rows in set (0.00sec)mysql> create tablecity(-> city_id smallint unsigned not nullauto_increment,-> city varchar(50) not null,-> country_id smallint unsigned not null,-> last_update timestamp not null default current_timestamp on update current_timestamp,-> primary key(city_id),-> keyidx_fk_country_id(country_id),-> constraint fk_city_country foreign key(country_id) references country(country_id) on delete restrict on update cascade

-> )engine=InnoDB default charset=utf8;

Query OK,0 rows affected (0.04sec)

mysql> desccountry;+-------------+----------------------+------+-----+-------------------+-----------------------------+

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

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

| country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |

| country | varchar(50) | NO | | NULL | |

| last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

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

3 rows in set (0.00sec)mysql> insert into country values(1,‘English‘,now());

Query OK, 1 row affected (0.00 sec)

mysql> select * from country;

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

| country_id | country | last_update |

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

| 1 | English | 2018-10-25 10:34:49 |

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

1 row in set (0.00 sec)

mysql> desc city;

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

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

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

| city_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |

| city | varchar(50) | NO | | NULL | |

| country_id | smallint(5) unsigned | NO | MUL | NULL | |

| last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

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

4 rows in set (0.00 sec)mysql> insert into city values(251,‘Kabul‘,1,now());

Query OK,1 row affected (0.00sec)

mysql> select * fromcity;+---------+-------+------------+---------------------+

| city_id | city | country_id | last_update |

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

| 251 | Kabul | 1 | 2018-10-25 10:36:51 |

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

1 row in set (0.00sec)

上面的“on update current_timestamp”表示更新表的记录的时候 ,也自动更新修改的时间。一句话“在创建新记录和修改现有记录的时候都对这个数据列刷新”。

1、现在我们删除父表中的一个数据记录。

mysql> delete from country where country_id=1;

ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`exercise`.`city`, CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE)

我们发现是删除不了的,因为字表参照了父表的一个记录(我们在字表参照里面设置了“限制在字表有关联的情况下父表不能删除”---delete  restrict)

2、然后我们更新一个记录看看。

mysql> update country set country_id=251 where country=‘English‘;

ERROR1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnmysql> SET SQL_SAFE_UPDATES=0; #我是以安全模式启动的mysql,设置一下就可以了

Query OK,0 rows affected (0.00sec)

mysql> update country set country_id=251 where country=‘English‘;

Query OK,1 row affected (0.01sec)

Rows matched:1 Changed: 1 Warnings: 0mysql> select * fromcountry;+------------+---------+---------------------+

| country_id | country | last_update |

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

| 251 | English | 2018-10-25 10:47:01 |

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

1 row in set (0.00sec)

mysql> select * fromcity;+---------+-------+------------+---------------------+

| city_id | city | country_id | last_update |

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

| 251 | Kabul | 251 | 2018-10-25 10:38:28 |

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

1 row in set (0.00 sec)

我们更新的父表的主键记录,发现子表的外键记录也自动更新了,因为子表的外键参照父表的主键。并且子表在约束条件里面写了"update cascade"。

3、现在我们删除父表的主键

mysql> alter table country drop columncountry_id;

ERROR1829 (HY000): Cannot drop column ‘country_id‘: needed in a foreign key constraint ‘fk_city_country‘ of table ‘exercise.city‘

当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。

还有一些需要注意的:

在导入多个表的数据的时候,如果需要忽略表之前的导入顺序,可以暂时关闭外键的检查,在执行load data和alter table操作的时候,可以暂时关闭外键约束来加快处理的速度。关闭的指令是“SET FORENGN_KEY_CHECKS=0”;执行完成之后,通过执行"SET FOREIGN_KEY_CHECKS=1"语句改回原始状态。

原文:https://www.cnblogs.com/FengGeBlog/p/9848530.html

mysql怎么设主键和外键_MySQL基础之 主键外键设置相关推荐

  1. mysql主键约束和外键约束的作用_MySQL中的主键约束和外键约束

    1.主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如 ...

  2. mysql 主键自增语句_MySQL 自增主键

    以下仅考虑 InnoDB 存储引擎. 自增主键有两个性质需要考虑: 单调性 每次插入一条数据,其 ID 都是比上一条插入的数据的 ID 大,就算上一条数据被删除. 连续性 插入成功时,其数据的 ID ...

  3. mysql主键自增策略_MySQL 自增主键机制

    自增主键:特指在自增列上定义的主键. 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑. 1. 自增值保存在哪? 不同的存储引擎保存自增值的策略不一样: a. 对于MyISAM引 ...

  4. mysql主键约束自动增长_MySQL教程45-MySQL主键自增长

    在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值.每增加一条记录,主键会自动以相同的步长进行增长. 通过给字段添加 AUTO_INCREM ...

  5. mysql修改外键字段报异常_mysql修改索引时,外键约束造成的奇怪问题_MySQL

    Mysql外键 bitsCN.com mysql修改索引时,外键约束造成的奇怪问题 事情是这样的,在Windows的mysql5.5 ,我想修改一个表的索引,于是执行 [sql] ALTER TABL ...

  6. mysql中主键约束如何关闭_mysql怎么去除主键约束

    我就废话不多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ...

  7. MySQL 基础 -- 约束(非空约束、唯一约束、主键约束、默认约束、检查约束、外键约束)

    1. 约束 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据. 目的:保证数据库中数据的正确.有效性和完整性. 约束分类: 1.1 约束演示:不含外键约束 案例需求: 根据需求,完成表结构 ...

  8. mysql自增主键到头了怎么办_自增主键用完了怎么办

    在面试中,大家应该经历过如下场景 面试官:"用过mysql吧,你们是用自增主键还是UUID?" 你:"用的是自增主键" 面试官:"为什么是自增主键?& ...

  9. Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)

    了解了主键索引的底层原理,主键索引其实就是根据主键字段建立相关的数据结构(B+树),此后在使用主键字段作为条件查询时,会直接根据主键查找B+树的叶子结点.除了主键索引外,普通索引和唯一键索引也是如此, ...

  10. mysql联合主键语句6_初探SQL语句复合主键与联合主键

    一.复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键. 比如 create table test ( name varchar(19), id nu ...

最新文章

  1. cdn加速怎么样刷新文件
  2. 2015年第六届蓝桥杯C/C++ A组国赛 —— 第三题:显示二叉树
  3. mysql更新数据 update格式和alter对比
  4. SQLAlchemy 多态进阶(__mapper_args__ )、多对多标签
  5. socket编程(二) select 模型
  6. Fedora10字体安装与美化
  7. iview“官方“实现的右键菜单
  8. 数据结构-01-图解后缀表达式值计算方式
  9. python中将字符变为大写_python3.4.3将汉字转换为大写拼音首字母
  10. Oracle查数据库某字段的本年数,上年同期数,同比
  11. PHP性能分析工具:xhprof
  12. 浅谈R语言基于ARCH模型股价波动率建模
  13. 2021高考秦安一中成绩查询,2021年天水高考状元是谁分数多少分,历年天水高考状元名单...
  14. 我的 Chrome 插件集
  15. Codeforces Round #376 (Div. 2) D. 80-th Level Archeology —— 差分法 + 线段扫描法
  16. 初中数学与计算机论文,初中数学优秀论文15篇
  17. input输入框模拟验证码输入效果
  18. 股票中如何数浪(数细浪)转自http://frend1.bokee.com/viewdiary.41172456.html
  19. uniapp 修改全局字体
  20. Freemarker简单实现一个代码生成器。

热门文章

  1. 【致远FAQ】A6+Cloud__V1.0_A6+cloud的M3端地址保存提示:not found
  2. Sophix热修复的简单使用
  3. linux获取本地ip命令,Shell获取当前主机ip地址
  4. 【转】《Unity Shader入门精要》冯乐乐著 书中彩图
  5. 三款好用的记账软件推荐
  6. 成为管理层必会的技能之一!利用Python打造一款员工管理系统~
  7. SolidWorks软件远程安装协助
  8. opencv 图像伽马校正
  9. 微信小程序怎么开通店铺呢?
  10. html中怎样把背景图片置顶,HTML5中背景图片如何设置