MySQL: ограничение внешнего ключа не применяется - PullRequest
5 голосов
/ 12 марта 2012

У меня есть две таблицы следующим образом:

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
);

Тогда я запустил следующее:

INSERT INTO customer (name) VALUES ('Customer1');

Теперь таблица customer содержит имя: Customer1, id: 1

Тогда я запустил это:

INSERT INTO client (name, customer_id) VALUES ('Client of Customer1',34);

Он должен был потерпеть неудачу, но он успешно вставлен. Почему это?

Это на MySQL 5.1 на Linux Mint.

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Do show create table customer. Он покажет двигатель, использованный в конце оператора create table. Если они отображаются как MyISAM, этот движок не поддерживает внешние ключи. Определения FK анализируются, но в противном случае игнорируются.

Чтобы таблица была Inno DB, которая поддерживает foren-ключи, вам нужно сделать

CREATE TABLE ( ... blah blah blah ...) TYPE=InnoDB;
                                       ^^^^^^^^^^^--force InnoDB type
1 голос
/ 12 марта 2012

Может быть проблема с движком, просто чтобы добавить движок при создании таблиц:

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

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
) ENGINE=INNODB;
...