4

只是想知道源表的外键约束在使用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 的答案。

4

1 回答 1

8

不,它不会在target. 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 的工作方式。无论如何,这对你今天没有帮助。

于 2012-11-20T22:45:11.403 回答