2

在处理 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 中没有列 test 为 2 的行。

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

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

MySQL 版本是 5.5.16,引擎是 InnoDB。

4

3 回答 3

1

我建议你更新工作台,我只有在使用我的 mac 时才会遇到同样的问题,创建的表没有约束,但是如果你运行生成的 sql,它将正确创建所有内容,我使用我的 windows 来创建它,它运行良好,然后经过大量测试,我更新了我的 mac 上的工作台版本,现在一切正常。

于 2013-08-09T00:09:23.247 回答
0

我建议与外键约束分开创建表。根据我使用 Workbench 的经验,使用 fk 约束需要牢记以下几点:

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

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

  • 引用的键必须是唯一键

  • 检查工作台上的输出是否有错误

我会尝试按如下方式创建您的 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_1FOREIGN KEY ( test2) REFERENCES t1( test)):

于 2012-09-11T15:33:03.220 回答
0

在我看来,它与结合 server_system_Variable:"foreign_key_check" 的权限有关。

通常 Workbench 使用 Root 用户连接到数据库。这赋予了他所有的特权。并使他能够在所有查询执行之前设置 foreign_key_check=0 并在执行结束时将其设置回 1。(这在从数据转储重新填充表时很有用,并且您不想关心重新填充表的顺序)。

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

于 2019-10-03T19:50:37.633 回答