mysql怎么设主键和外键_MySQL基础之 主键外键设置
外键:
定义:如果表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基础之 主键外键设置相关推荐
- mysql主键约束和外键约束的作用_MySQL中的主键约束和外键约束
1.主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如 ...
- mysql 主键自增语句_MySQL 自增主键
以下仅考虑 InnoDB 存储引擎. 自增主键有两个性质需要考虑: 单调性 每次插入一条数据,其 ID 都是比上一条插入的数据的 ID 大,就算上一条数据被删除. 连续性 插入成功时,其数据的 ID ...
- mysql主键自增策略_MySQL 自增主键机制
自增主键:特指在自增列上定义的主键. 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑. 1. 自增值保存在哪? 不同的存储引擎保存自增值的策略不一样: a. 对于MyISAM引 ...
- mysql主键约束自动增长_MySQL教程45-MySQL主键自增长
在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值.每增加一条记录,主键会自动以相同的步长进行增长. 通过给字段添加 AUTO_INCREM ...
- mysql修改外键字段报异常_mysql修改索引时,外键约束造成的奇怪问题_MySQL
Mysql外键 bitsCN.com mysql修改索引时,外键约束造成的奇怪问题 事情是这样的,在Windows的mysql5.5 ,我想修改一个表的索引,于是执行 [sql] ALTER TABL ...
- mysql中主键约束如何关闭_mysql怎么去除主键约束
我就废话不多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ...
- MySQL 基础 -- 约束(非空约束、唯一约束、主键约束、默认约束、检查约束、外键约束)
1. 约束 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据. 目的:保证数据库中数据的正确.有效性和完整性. 约束分类: 1.1 约束演示:不含外键约束 案例需求: 根据需求,完成表结构 ...
- mysql自增主键到头了怎么办_自增主键用完了怎么办
在面试中,大家应该经历过如下场景 面试官:"用过mysql吧,你们是用自增主键还是UUID?" 你:"用的是自增主键" 面试官:"为什么是自增主键?& ...
- Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)
了解了主键索引的底层原理,主键索引其实就是根据主键字段建立相关的数据结构(B+树),此后在使用主键字段作为条件查询时,会直接根据主键查找B+树的叶子结点.除了主键索引外,普通索引和唯一键索引也是如此, ...
- mysql联合主键语句6_初探SQL语句复合主键与联合主键
一.复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键. 比如 create table test ( name varchar(19), id nu ...
最新文章
- cdn加速怎么样刷新文件
- 2015年第六届蓝桥杯C/C++ A组国赛 —— 第三题:显示二叉树
- mysql更新数据 update格式和alter对比
- SQLAlchemy 多态进阶(__mapper_args__ )、多对多标签
- socket编程(二) select 模型
- Fedora10字体安装与美化
- iview“官方“实现的右键菜单
- 数据结构-01-图解后缀表达式值计算方式
- python中将字符变为大写_python3.4.3将汉字转换为大写拼音首字母
- Oracle查数据库某字段的本年数,上年同期数,同比
- PHP性能分析工具:xhprof
- 浅谈R语言基于ARCH模型股价波动率建模
- 2021高考秦安一中成绩查询,2021年天水高考状元是谁分数多少分,历年天水高考状元名单...
- 我的 Chrome 插件集
- Codeforces Round #376 (Div. 2) D. 80-th Level Archeology —— 差分法 + 线段扫描法
- 初中数学与计算机论文,初中数学优秀论文15篇
- input输入框模拟验证码输入效果
- 股票中如何数浪(数细浪)转自http://frend1.bokee.com/viewdiary.41172456.html
- uniapp 修改全局字体
- Freemarker简单实现一个代码生成器。