只是想知道在使用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的答案。
答案 0 :(得分:5)
不,它不会在target
中创建FK约束。 CREATE TABLE ... SELECT只查看SELECT结果集的列和数据类型,并确定新表的定义。
我认为使用CREATE TABLE ... LIKE可能是一种解决方法,但我在MySQL 5.5上进行了测试,它也没有创建外键。
CREATE TABLE target LIKE source;
我猜测因为外键是在InnoDB存储引擎中实现的,而不是由独立于存储的MySQL层识别,它们可能不会出现在与存储无关的.FRM文件中。
此错误似乎确认通过简单地复制.FRM文件来实现CREATE TABLE ... LIKE:http://bugs.mysql.com/bug.php?id=35526
但是提到的修复程序被放入了MySQL 6.1分支,很久以前该分支被杀死了。
所以现在,你必须将外键声明为一个单独的步骤。我知道将来,.FRM文件会消失,所以他们必须改变CREATE TABLE ... LIKE的工作方式。无论如何,今天对你没有帮助。