在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。
外键的使用条件:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
语法一:后续添加方法
alter table 表名 add constraint 约束名 foreign key(当前表中约束的字段) references 主表表名(要约束的字段名); alter table student add constraint fk_class_student foreign key(cls_id) class(cls_id) on update cascade on delete no action;
语法二:创建表的方法
CREATE TABLE student( sid int PRIMARY KEY, cls_id int not null, sname varchar(10) not null, constraint fk_class_student foreign key(cls_id) references class(cls_id) on update cascade on delete no action )ENGINE=InnoDB DEFAULT CHARSET=utf8;
一个额外点:
SHOW CREATE TABLE class
可以查询表的建表信息
CREATE TABLE `class` ( `cls_id` int NOT NULL, `cls_name` varchar(15) NOT NULL, PRIMARY KEY (`cls_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
下面的演示我们就使用刚刚创建的这个学生表和班级表
内容如下
在父表上进行update/delete操作时,子表的操作类型
以我们刚刚设置的外键为例(on update cascade on delete no action)
当我们尝试进行删除操作时
delete from class WHERE cls_id=1
结果如下
可以看到由于外键约束中on delete no action的存在,不允许对主表进行删除操作。但是子表可以
delete from student WHERE cls_id=1
当我们对父表的关联键进行更新操作时,由于on update cascade的存在,可以正常更新
UPDATE class set cls_id=4 where cls_id=1
并且随着主表的更新,子表中的外键字段也进行了更新
alter table 子表名 drop foreign key 外键约束名 alter table student drop foreign key fk_class_student
当我们将外键删除之后,父表的操作就变得可以正常进行了
到此这篇关于MySQL中外键创建、约束以及删除的文章就介绍到这了,更多相关MySQL外键创建、约束及删除内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
我在创建mysql数据库中现有表的外键时遇到了一些问题。 我不想创建一个名为的新表来引用它,使用以下方法: 但我发现了错误: 为了获得更多的信息,我做了: 在我看来,这两个列的类型似乎是匹配的,因为它们都是varchar(45)。(我还尝试将列设置为not null,但这没有解决问题)所以我猜问题一定是。但我不太清楚这意味着什么,也不知道如何检查/修复它。有人有什么建议吗?是什么意思?
问题内容: 我想使用外键来保持完整性并避免使用孤立键(我已经使用过innoDB)。 如何创建在CASCADE上删除的SQL语句? 如果我删除一个类别,那么如何确保它不会删除也与其他类别相关的产品。 数据透视表“ categories_products”在其他两个表之间创建多对多关系。 问题答案: 如果您的级联删除某个产品是因为该产品属于被杀类别的成员,那么它会删除该产品,那么您的外键设置不正确。给
主要内容:在创建表时设置外键约束,在修改表时添加外键约束,删除外键约束MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西
我试图在两个表之间创建一个外键约束,但在执行alter命令之后,mysql创建了索引而不是外键。 我使用的是hibernate,所以最初我认为这是hibernate的问题,但当我直接在mysql上执行查询时,行为是一样的。 更改表person添加约束FK9ircw28d19mdg5pu8yfg1qs8p外键(Address_Id)引用地址(Address_Id) 运行此命令后,我会在mysql数据
方法正在工作,我已经创建了其他简单的表没有问题。 我用的是MySQL服务器8.0 这是对表的测试,然后我将创建一个脚本来创建它们。我一直有这个错误: 无法创建表,SQLException:无法添加外键约束 但我不知道怎么了。 plhd--11/>ConnectionImpl.execSQL(ConnectionImpl.java:2570)[23:51:36 WARN]:在com.mysql.jd
嗨,我知道有人问过这个问题,但我还没有找到正确的答案,为什么当我尝试做我的第二个插入: 我得到了错误: 错误1452(23000):无法添加或更新子行:外键约束失败(.,约束外键()引用()) 下面的DDL代码: