QQ 老汤微信二维码

mysql外键约束怎么写(详解数据库定义外键约束的语句)

 分类: IT知识时间:2022-12-06 07:31:02点击:

学习目标

  • 掌握外键约束的添加方法
  • 知道外键约束字段的添加及删除规则

1.多表查询概述

l实际开发中,一个项目通常需要很多张表才能完成。

l例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。

一对多关系:

常见实例:客户和订单,分类和商品,部门和员工。

一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。

2.外键约束

2.1外键约束的定义

现在我们有两张表“分类表”和“商品表”

为了表明商品属于哪个分类,通常情况下,==我们将在商品表上添加一列,用于存放分类cid的信息==,此列称为:外键

此时“分类表==category”称为:主表==,“cid”我们称为主键。“商品表==products”称为:从表==,category_id称为外键。我们通过主表的主键和从表的外键来描述主外键关系,呈现就是==一对多关系==。

外键特点:

从表外键的值是对主表主键的引用。

从表外键类型,必须与主表主键类型一致。

举例:


上述表中,product表中的两条记录中的商品,都属于汽车分类。

category分类表,为唯一方,也就是主表,必须提供主键cid

products商品表,为多方,也就是从表,必须提供外键category_id

2.2绑定外键约束

为了我们可以更加清楚的体现商品表与分类表之间的联系,我们准备以下两张表,并建立外键关联关系:

绑定外键约束的格式如下:

在创表语句后添加:CONSTRAINT FOREIGN KEY (外键字段) REFERENCES 主表名(主键)

# 创建分类表CREATETABLEcategory( cid VARCHAR(32) PRIMARY KEY, cname VARCHAR(100) #分类名称); # 商品表CREATETABLEproducts ( pid VARCHAR(32) PRIMARY KEY, nameVARCHAR(40), price DOUBLE, category_id VARCHAR(32), # CONSTRAINT 约束# REFERENCES 参考CONSTRAINTFOREIGNKEY(category_id) REFERENCEScategory(cid) # 添加约束); # 查看表结构# 主表不需要进行任何操作,从表在表内设置外键字段,绑定主表主键即可DESC products; DESC category;

此时,主表结构为:


从表结构为:


外键约束绑定成功。

2.3外键约束检测

插入数据

接下来,我们向分类(category)表中添加数据记录。

INSERTINTOcategory(cid ,cname) VALUES('c001','服装');

向商品表添加普通数据,没有外键数据,默认为null

INSERTINTOproducts (pid,pname) VALUES('p001','土豆');

然后向商品(product)表中添加数据记录,外键信息填写刚才插入的主表主键的值”c001“

INSERTINTOproducts (pid ,pname ,category_id) VALUES('p002','夹克','c001');

思考:如果在从表中插入的外键值,在主表中不存在会怎样? 我们来试一下:

INSERTINTOproducts VALUES('p003', '坦克', 1200000, 'c002');

此时将会报错,错误信息为:Cannot add or update a child row: a foreign key constraint fails (test01.products, CONSTRAINTproducts_ibfk_1FOREIGN KEY (category_id) REFERENCEScategory(cid))。

得出结论:==当我们引用的外键,在主表主键中没有相同的值,则不能插入,但是可以插入空值==。

删除数据

我们将分类(category)表中的’c001‘数据进行删除

DELETEFROMcategoryWHEREcid = 'c001';

此时将会报错,错误信息为Cannot delete or update a parent row: a foreign key constraint fails (test01.products, CONSTRAINTproducts_ibfk_1FOREIGN KEY (category_id) REFERENCEScategory(cid))。

为什么会出现这种情况呢??

我们再尝试一下,先将商品(product)表中,引用主表中该条数据的记录删除。

DELETEFROMproducts WHEREpid = '002';

删除后,此时没有任何从表记录引用主表的c001分类,我们再次尝试删除分类(category)表中的’c001‘数据。

DELETEFROMcategoryWHEREcid = 'c001';

删除成功。

由此我们得出结论:==如果要删除主表中的记录,需要先将从表中所有引用该数据的记录删除或者修改为引用其他记录==。

2.4外键约束的优点

  • ==在插入数据时,保证了数据的准确性==
  • ==在删除数据时,保证了数据的完整性==

3.小结

  • 实际开发中,一个项目通常需要很多张表才能完成。
  • 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
  • 从表外键的值是对主表主键的引用。
  • 从表外键类型,必须与主表主键类型一致。
  • 从表中引用了主表中的数据,主表中数据不可被删除。
  • 主表中没有数据,从表外键也无法被插入。
  • 外键约束的优点:
  • 在插入数据时,保证了数据的准确性
  • 在删除数据时,保证了数据的完整性
除注明外的文章,均为来源:老汤博客,转载请保留本文地址!
原文地址: https://tangjiusheng.com/it/2116.html
  • 关注下 头条号后,请私信将免费分享给你一份web前端资料!
  • 立即关注
大家都在看
  • mysql内连接和外连接的区别(内连接和外连接详解)
  • MySQL入门必会的MySQL命令
  • php开发人员必需掌握的MySQL数据类型
  • SQL和MySQL的区别(MySQL和SQL是什么)
  • sqlserver和mysql区别(sqlserver和mysql哪个功能更强大)
  • sql server和mysql区别(主流数据库的不同点在哪)
  • navicat连接mysql步骤(手把手教会你navicat连接mysql)
  • mysql删除表数据的语句(教你如何增删改表中数据)
  • MySQL数据库数据类型有哪几种(10种常用数据类型知识总结)
  • 数据库创建表的方式有哪几种(mysql创建数据表的2种方式)

聚圣源姓苑起名甘宝宝起名树 起名字三生三世枕上全集免费观看手机ip地址查询集团公司怎么取名起名大全s1224r长濑凑粉末冶金加工给学校起个名子女总裁的全能兵王小说五行缺木咋起名字官场之风流人生txt邓氏男人起名车友俱乐部起名大全操姓男孩起名女孩起名字的字寓意鱼业公司起名字位图是什么何荣柱起名真的很好吗怎样免费起名大集汇娱乐武汉墙绘心动游戏中级经济师报名起了怎么缴费女孩 起名户外运动店铺起名神棍机甲属猴人起名大全你是我的城池营垒小说免费阅读淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化