外键约束 mysql

让表与表之间产生关系,从而保证数据的正确性

建表时创建外键

create table 表名(...constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);

例子


-- 建老师表(主表)
CREATE TABLE t3(
id INT PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(5)
);-- 建学生表(从表)
CREATE TABLE s3(
id INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(5),
tid INT,
CONSTRAINT fk_st FOREIGN KEY (tid) REFERENCES t3(id)
);

删除外键

alter table 表名 drop foreign key 外键名;

追加外键

alter table 表名 add constraint 外键名 foreign key (外键列名称) references 主表名称(主表关联列)

单词


演练代码

-- 外键关联的演练
-- 建表时创建外键-- 建库
CREATE DATABASE testForeignKey CHARACTER SET utf8;-- 选中库
USE testForeignKey;-- 查看选中
SELECT DATABASE();-- 建主表,老师表
CREATE TABLE teacher(
-- id int primary key auto_increment,
id INT PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(5)
);-- 查看表
SHOW TABLES;-- 建从表,学生表
-- 学生表中定义一个列作为外键列,起名就叫tid吧
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(5),
tid INT,
-- 格式
-- constraint 外键名称 foreign key(外键列名称) references 主表名称(主表主键名)
CONSTRAINT fk_st FOREIGN KEY(tid) REFERENCES teacher(id)
);-- 查看表结构
DESC student;-- 外键演练
-- 在表创建好后追加外键
-- 新建一个班级表 一个老师带多个班级,多个班级由一个老师带
-- 班级表是从表,老师表是主表
-- 在从表中建外键列
-- 先新建一个班级表,假设没有考虑到一些事情,我们通过追加的方式补齐
CREATE TABLE classTab(
id INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(6)
);-- 查看表结构
DESC classTab;-- 突然想起来班级表要与老师关联起来
-- 追加老师id列,起名tid
ALTER TABLE classTab ADD tid INT;-- 查看表结构
DESC classTab;-- 给tid列添加外键关联
-- 格式
-- alter table 表名 add constraint 外键名 foreign key(外键列名) references 主表名称(主表主键名)
ALTER TABLE classTab ADD CONSTRAINT fk_ct FOREIGN KEY (tid) REFERENCES teacher(id);-- 查看表结构
DESC classTab;-- 目标,取消外键
-- 把班级表的老师外键取消掉,让它成为一个普通的列
DESC classTab;-- 查看建表语句,从建表语句中拿到外键名称
SHOW CREATE TABLE classTab;-- 丢掉外键
ALTER TABLE classTab DROP FOREIGN KEY fk_ct;-- 查看建表语句
SHOW CREATE TABLE classTab;-- 查看表结构
DESC classTab;-- 外键的影响力
-- 当前学生与老师表是有关联的,往里面添加数据-- 显示老师表
SELECT * FROM teacher;-- 添加老师
INSERT INTO teacher VALUES(NULL,'卡卡西'),(NULL,'自来也');-- 显示学生数据
SELECT * FROM student;-- 添加学生信息
INSERT INTO student VALUES(NULL,'鸣人',1);-- 显示所有信息
SELECT * FROM teacher;
SELECT * FROM student;-- 往学生表中插入一个学生,给它一个不存在的老师id
-- Cannot add or update a child row: a foreign key constraint fails (`testforeignkey/student`, CONSTRAINT `fk_st` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`))
-- 无法插入,这是受到了外键的影响
INSERT INTO student VALUES(NULL,'博人',999);-- 尝试修改老师表的id
UPDATE teacher SET id = 6 WHERE tname='自来也';-- 查看老师表
SELECT * FROM teacher;
-- 学生表查看
SELECT * FROM student;-- 修改一个关联了学生的老师信息试试
-- 1号老师有学生, 1号老师的主键可以改变吗???
UPDATE teacher SET id=7 WHERE tname='卡卡西';
-- 防止代码打错,粘个
UPDATE teacher SET id = 7 WHERE tname='卡卡西';-- 小结,如果老师有关联学生,那么它是无法修改主键id的
-- 报错:Cannot delete or update a parent row: a foreign key constraint fails (`testforeignkey/student`, CONSTRAINT `fk_st` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`))
-- 同理,它也无法删除(关联了学生的老师,无法删除)
DELETE FROM teacher WHERE tname='自来也';
-- 自来也没带学生,他可以被删掉
DELETE FROM teacher WHERE tname='卡卡西';
-- 卡卡西有带学生, 所以他不可以删除-- 小结
-- 如果主表中的数据行有从表的数据和他关联,那么,这一行不可删除,另外它的主键id无法改变-- ?? 主键id不可改变,那tname呢?
-- 试一试UPDATE teacher SET tname='复制忍者卡卡西' WHERE id=1;-- 查询
SELECT * FROM teacher;-- 结论
-- 由于主表的值被从表所使用,所以主表的主键不可随意变更
-- 主表的其它列是可以被变更的-- 最后小结
-- 主表与从表关联后的影响
-- 主键不可改变
-- 非主键可以改变
-- 被关联的主表行不可删除

外键约束 mysql相关推荐

  1. MySQL外键约束(FOREIGN KEY)是什么?

    向导 外键约束 外键创建规则 创建外键约束语法 外键约束创建 修改创建外键约束 删除外键 完整格式创建 外键约束 MySQL的外键约束用来在两个表数据之间建立链接,其中一张表的一个字段被另一张表中对应 ...

  2. (19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)

    MySQL数据库基础下 一.修改表--添加外键约束 二.多表之间的建表原则 1.建数据库原则:通常情况下,一个项目/应用建一个数据库 2.多表之间的表原则: (1)一对多:分类和商品 (一个分类对应多 ...

  3. MySQL导入数据,存在外键约束不能导入数据的处理方式

    我们通常导入数据脚本的时候会遇到如下错误: 1451 -Cannot delete or update a parent row: a foreign key constraint fails (.. ...

  4. MySQL多表操作的外键约束

    目录 一.多表关系 一对一关系 一对多/多对一关系 多对多关系 二.外键约束 特点 创建外键约束 方式1-在创建表时设置外键约束 方式2-在创建表时设置外键约束 在外键约束下的操作 1.数据插入 2. ...

  5. oracle外键约束怎么删除,mysql oracle 删除外键约束

    oracle 删除外键约束 禁用约束 启用约束 oracle 删除外键约束 禁用约束 启用约束 执行以下sql生成的语句即可 删除所有外键约束 Sql代码  select 'alter table ' ...

  6. mysql怎么写主外键_mysql主外键约束怎么写?

    mysql主键约束的写法:"CREATE TABLE 表名(字段名 数据类型 PRIMARY KEY)":mysql外键约束的写法:"CREATE TABLE 表名(FO ...

  7. oracle外键约束强行insert,oracle 禁用外键约束

    1.ORACLE数据库中的外键约束名都在表user_constraints中可以查到.其中constraint_type='R'表示是外键约束. 2.启用外键约束的命令为:alter table ta ...

  8. 教你mysql如何增加外键约束

    在本篇文章里小编给大家整理的是一篇关于mysql增加外键约束具体方法及相关实例内容,有兴趣的朋友们可以跟着学习下. 本教程操作环境:windows7系统.mysql8版本.Dell G3电脑. MyS ...

  9. mysql另外加外键约束怎么写_mysql外键约束怎么写

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

最新文章

  1. git push代码到远程新分支
  2. java闭锁_java8中CountDownLatch闭锁
  3. 前端页面可视化设计工具
  4. 测试如何学python_如何从0开始学Python自动化测试
  5. 如何基于asp.net core的Identity框架在mysql上作身份验证处理
  6. serialversionuid的作用_为什么阿里Java规约要求谨慎修改serialVersionUID字段
  7. 【飞秋】ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码
  8. 蜜罐网络(开源汇总)MHN
  9. Docker笔记2 容器及其基本操作
  10. PHPCMS_单入口初始化执行流程
  11. JavaScript(三)数值类型
  12. 做了一个收录 rss opml 文件的仓库,欢迎推荐 opml
  13. matlab把句子分割成单词_将英语句子单个单词分割存储
  14. 液晶显示器不宜使用屏幕保护程序
  15. 村路安防工程建设展开 未来投入将进一步加大
  16. 美国国防科研情报追踪系统发布,200余所美国实力高校尽收眼底!
  17. python 爬取拉钩网数据
  18. 艾永亮:英语教育往事:一部商业的进化史
  19. SRE运维工程师笔记-Linux文件管理和IO重定向
  20. 备战APEC 智利公布2019峰会主要议题

热门文章

  1. 输出图片任意点的像素坐标(结合IRFANVIEW使用)
  2. 4-1MapReduce概述
  3. copyToLocalFile报出空异常
  4. [Matlab] PDETool 的 Set Formula 的元素排列顺序会影响 Boundary 的判定
  5. php报错致命错误203,Centos7 下安装PHP7 phpredis扩展报错解决办法 致命错误:ext/standard/php_smart_str.h...
  6. wordpress插件-WP Rocket3.8.8与Rocket3.9.1双版本/火箭缓存插件免授权汉化版
  7. hp-ux mysql_HP-UX 安装MySQL
  8. 萝卜源码前后端源码 附打包APP的教程
  9. 西餐美食店响应式网站模板
  10. 百度SEO网页背景渐变色代码