mysql - create...select 语句中的外键约束会发生什么变化?

标签 mysql sql

只是想知道当使用 CREATE...SELECT 语句复制源表时,源表的外键约束会发生什么情况。引用约束会被复制还是被忽略?

这是一个例子:

CREATE TABLE foo(a int, b int, PRIMARY KEY(a));
CREATE TABLE source(id int, a int, PRIMARY KEY(id), FOREIGN KEY(a) REFERENCES foo(a));

CREATE TABLE target SELECT * FROM source;

所以,我的问题是目标上的属性 a 是否也指向 foo(a)?如果答案是特定于供应商的,我正在寻找 MySQL 的答案。

最佳答案

不,它不会在 target 中创建 FK 约束。 CREATE TABLE...SELECT 只查看 SELECT 结果集的列和数据类型,这决定了新表的定义。

我认为使用 CREATE TABLE...LIKE 可能是一种解决方法,但我在 MySQL 5.5 上对其进行了测试,它也不会创建外键。

CREATE TABLE target LIKE source;

我猜是因为外键是在 InnoDB 存储引擎中实现的,不被 MySQL 的存储独立层识别,它们可能不会出现在存储独立的 .FRM 文件中。

这个错误似乎证实了 CREATE TABLE...LIKE 是通过简单地复制 .FRM 文件来实现的:http://bugs.mysql.com/bug.php?id=35526

但是提到的修复被放入了 MySQL 6.1 分支,而那个分支早就被杀死了。

所以现在,您必须将外键声明为一个单独的步骤。我知道将来 .FRM 文件会消失,因此他们必须更改 CREATE TABLE...LIKE 的工作方式。无论如何,今天这对你没有帮助。

关于mysql - create...select 语句中的外键约束会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13483385/

相关文章:

mysql - 什么是 org.h2.jdbc.JdbcSQLDataException : Invalid value "3" for parameter "columnIndex" [90008-200]?

sql - 在表中复制列名有什么用吗?

php - 如果当前输入中没有则删除表条目

MySQL嵌套查询HAVING字段

php - 用户和公司 - 数据库架构

内部连接和位置的 MySQL 查询错误

mysql - Mysql 中的光标在 Mysql 5.57 中不起作用

sql - 使用计数我只得到一行

mysql - SQL变量未在go客户端的选择查询中更新

mysql - 按年份和月份选择项目范围