2012-11-20 29 views
3

想知道使用CREATE...SELECT语句复制源表时外键约束会发生什么情况。参考约束是否会被复制或忽略?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的答案。

回答

5

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

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

CREATE TABLE target LIKE source; 

我猜是因为外键在InnoDB存储引擎实现的,而不是由MySQL的存储无关层的认可,他们可能不会在独立于存储的.frm文件显示出来。

这个bug似乎证实CREATE TABLE ... LIKE被简单地复制.frm文件执行:http://bugs.mysql.com/bug.php?id=35526

但提到被放入的MySQL 6.1分支的修复及分支不久前被打死。

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