MYSQL添加外键问题

需要明确的是,在 MySQL 中使用外键非常简单,但有几个先决条件需要注意。
我们先来说说最重要的事情。
表类型必须是InnoDB,并且两个表都必须是InnoDB。
还有一点是应该指出外键。
从版本 4 .1 .2 及更高版本开始,建立外键会自动创建索引。
还有另一个重要的细节。
外键关系中两个表的列必须具有相同的数据类型。
例如,int 和tinyint 被接受,但int 和char 不被接受。

一开始我以为只要两个表都是InnoDB就可以随意创建外键。
但后来我意识到这是错误的,必须满足其他条件。
等等,还有一件事,外键引用列不能是自动增量列,除非它是主键。

因此,如果您计划在 MySQL 中使用外键,请记住这些先决条件以避免陷入陷阱。
我觉得值得一试,首先检查你表的类型,然后检查列的数据类型是否兼容,最后检查版本号是否满足自动创建索引的要求。

mysql创建外键的sql语句

哦,我对这个创建 MySQL 外键的 SQL 语句非常着迷。
这听起来很复杂,但是当你分解它时,它实际上只包含几个步骤。

先说基本命令,就是ALTER TABLE子表名ADD FOREIGN KEY(外键列名)REFERENCES父表名(主键列名)。

例如,假设我们有一个客户表,主键是 customer_id。
如果我们想为 Orders 表创建外键,我们必须编写: ALTER TABLE Orders ADD FOREIGN KEY (customer_id) REFERENCES Customers (customer_id)。

这就像在两个表之间画一条线,告诉数据库 Orders 表中的 customer_id 列链接到 Customers 表中的 customer_id 列。

有时,您可能还想指定删除和更新行为。
例如,如果您希望在删除父表中的记录时自动删除子表中的相关记录,请在末尾添加 ON DELETE CASCADE,如下所示: ALTER TABLE 命令 ADD FOREIGN KEY (customer_id) 客户引用 (customer_id) ON DELETE CASCADE。

比如要更新父表的主键,子表的外键也会更新,那么在最后加上ON UPDATE CASCADE。

另一种情况是父表的主键是复合键,如(dept_id, emp_id),子表的外键也必须是(dept_id, emp_id)。
在这种情况下,您必须这样写: ALTER TABLE member_projects ADD FOREIGN KEY (dept_id, emp_id) 员工引用 (dept_id, emp_id)。

回到注意事项,首先需要保证外键列和原表主键的类型、长度、字符集必须一致。
就像穿衣服一样,你必须穿得得体,对吗?
第三,父表和子表必须使用支持外键的存储引擎,例如InnoDB。
这就像说你必须在能够支撑重量的基础上建造一座桥梁,对吗?
另外,原表的外键和主键列通常需要索引,因为InnoDB会自动为外键创建索引,就像为桥梁搭建支撑结构一样。

如果希望外键有一个名称以便将来管理,可以在 CONSTRAINT 后添加自定义名称,如下所示: ALTER TABLE ADD CONSTRAINT 命令 fk_customer_order FOREIGN KEY (customer_id) 客户引用 (customer_id)。

最后,如果添加外键失败,您应该检查数据以查看是否违反了约束,例如表包含子键包含原始表中不存在的外键值。
这就像检查桥梁是否存在安全隐患。

说实话,国外的交换机虽然会增加一些性能开销,但是可以极大的提高数据的一致性,就像桥梁可以保证交通安全一样。
因此,合理使用外键可以有效维护数据库的引用完整性。
这个道理我当时不太明白,但是后来多实践之后,我就慢慢明白了。