MySQL Workbench忽略外键

时间:2012-09-11 14:06:21

标签: mysql foreign-keys mysql-workbench

在MySQL Workbench中处理SQL编辑器时,我偶然发现了一些奇怪的事情,执行似乎忽略了外键约束。这是一个例子:

create database testdb;

use testdb;

create table t1 (
 `test` INT,
 PRIMARY KEY (`test`)
) ENGINE = InnoDB;

create table t2 (
`test1` INT,
`test2` INT,
 FOREIGN KEY (`test2`) REFERENCES t1(test),
PRIMARY KEY (`test1`)
) ENGINE = InnoDB;

insert into t1 values (1);

insert into t2 values (1,1);
insert into t2 values (2,2);

在此示例中,insert into t2 values (2,2);应该失败,因为t1中没有行,其中列测试为2。

我已经在phpMyAdmin中测试过,它正确地失败了,并且出现了违反外键约束的错误,但是在MySQL Workbench中它没有给出错误,并且它被插入到表中(我已经检查过了)用phpMyAdmin)。

这对我来说不是一个大问题,因为我可以使用不同的客户端来输入SQL,但我对它的工作原理感兴趣,因为在我对外键的理解中,值需要存在于参考表。

MySQL版本是5.5.16,引擎是InnoDB。

3 个答案:

答案 0 :(得分:1)

我建议你更新工作台,我只是在使用我的mac时遇到了同样的问题,在没有约束的情况下创建的表但是如果运行sql生成它将正确创建所有内容,我使用我的窗口来创建它工作完美,然后经过大量的测试我更新我的Mac上的工作台版本,现在一切都很完美。

答案 1 :(得分:0)

我建议与外键约束分开创建表。根据我使用Workbench的经验,这些是fk约束要记住的事情:

  • 两个表格必须为InnoDB
  • 数据类型必须完全匹配(包括默认值)
  • 确保外键不存在。

    SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE()

  • 引用的密钥必须是唯一密钥

  • 检查Workbench上的输出是否有错误

我会尝试按如下方式创建您的FK约束:

CREATE TABLE t1 (
 `test` INT,
 PRIMARY KEY (`test`)
) ENGINE = InnoDB;

INSERT INTO t1 VALUES (5);

CREATE TABLE t2 (
`test1` INT,
`test2` INT,
PRIMARY KEY (`test1`)
) ENGINE = InnoDB;

ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY (test2) REFERENCES t1 (test);

然后我们可以测试:

INSERT INTO t2 VALUES (1, 4);
  

无法添加或更新子行:外键约束失败.... CONSTRAINT t2_ibfk_1 FOREIGN KEY(test2)REFERENCES t1test)):

答案 2 :(得分:0)

在我看来,它与与server_system_Variable:“ foreign_key_check”组合使用特权有关。

通常,工作台使用Root用户连接到数据库。这使他享有所有特权。并允许他在所有查询执行之前将foreign_key_check = 0设置为零,并在执行结束后将其设置回1。 (这在从数据转储中重新填充表时非常有用,而且您不想关心表的重新填充顺序)。

设置全局系统变量运行时值通常需要SYSTEM_VARIABLES_ADMIN或SUPER特权。当您创建一个没有所有特权的新用户时,它似乎可以正常工作。