MySQL:未执行外键约束

R.V*_*.V. 5 mysql foreign-keys foreign-key-relationship

我有两个表,如下所示:

CREATE TABLE customer
(
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(25),
  PRIMARY KEY(id)
);

CREATE TABLE `client`
(
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(200),
  `customer_id` INT NOT NULL,

   PRIMARY KEY(`id`),
   INDEX(`customer_id`),
   FOREIGN KEY (`customer_id`) REFERENCES `customer`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT
);
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令:

INSERT INTO customer (name) VALUES ('Customer1');
Run Code Online (Sandbox Code Playgroud)

现在表customer包含名称:Customer1,id:1

然后我运行了这个:

INSERT INTO client (name, customer_id) VALUES ('Client of Customer1',34);
Run Code Online (Sandbox Code Playgroud)

它本来应该失败,但是成功插入了。这是为什么?

这是在Linux Mint上的MySQL 5.1上。

Mar*_*c B 4

做一个show create table customer. 它将显示转储语句末尾使用的引擎create table。如果它们显示为 MyISAM,则该引擎不支持外键。FK 定义会被解析,但会被忽略。

要强制表成为 Inno DB(它支持 foren 键),您必须执行以下操作

CREATE TABLE ( ... blah blah blah ...) TYPE=InnoDB;
                                       ^^^^^^^^^^^--force InnoDB type
Run Code Online (Sandbox Code Playgroud)