外键:

定义:如果表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. 数据库开发——MySQL——primary key
  2. 在openstack环境中安装rackspace private cloud --1 环境准备
  3. C++调用Asprise OCR识别图片
  4. python asyncio和celery对比_如何将Celery与asyncio结合? - python
  5. 上采样,下采样,过采样,欠采样的区别
  6. 《日志管理与分析权威指南》一2.3 良好日志记录的标准
  7. JSON格式数据与数据组件
  8. 一场别开生面的黑客面基大会
  9. 压缩包文件解压找回密码
  10. Arcgis中的坐标和投影
  11. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
  12. (转)[视频压制/转换技术] I帧 B帧 P帧 IDR帧 等帧用途详细说明
  13. 数据结构——二叉树的实现
  14. 书写函数:求棋盘上芝麻重量
  15. 快手、抖音、微视类短视频SDK接入教程,7步就能搞定
  16. Tomcat配置完成后打不开localhost网页解决方法
  17. 吴教授的CNN课堂:进阶 | 从LeNet到残差网络(ResNet)和Inception Net
  18. Python 3 列表
  19. 【SSM架构】博客系统开发(七)-登陆界面
  20. mysql选取除某一列的所有行_在 MySQL 中选择除了某一列以外的所有列

热门文章

  1. 单尺度Retinex
  2. 手机APP测试类型与方法
  3. app如何添加广告位 uni_广告以及广告位的详细说明(如何在APP中添加广告)
  4. 12个常见idea快捷键
  5. 电子元器件简介——电容与电感篇
  6. 京东羚珑页面可视化平台介绍
  7. ROS-3DSLAM(4):lidar_odometry包浅析
  8. 【180620】小人物走路、奔跑的VC++游戏特效
  9. LaTeX Studio下载安装
  10. Android 如何优化开屏广告?