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

Pir*_*ooz 3 mysql sql

只是想知道在使用CREATE...SELECTstatement 复制源表的外键约束时会发生什么.是否会复制或忽略引用约束?

这是一个例子:

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;
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*win 5

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

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

CREATE TABLE target LIKE source;
Run Code Online (Sandbox Code Playgroud)

我猜测因为外键是在InnoDB存储引擎中实现的,而不是由独立于存储的MySQL层识别,它们可能不会出现在与存储无关的.FRM文件中.

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

但是提到的修复程序被放入MySQL 6.1分支,并且该分支很久以前就被杀死了.

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