Требуется применение внешнего ключа MYSQL - PullRequest
0 голосов
/ 30 мая 2011

Рассмотрим следующий SQL:

    CREATE DATABASE TEST01234;
    USE TEST01234;

    CREATE TABLE PARENT (
      PARENT_NAME varchar(255) PRIMARY KEY,
      PARENT_DESC varchar(255));

    CREATE TABLE CHILD (
      PARENT_NAME varchar(255),
      CHILD_NAME varchar(255),
      CHILD_DESC varchar(255),
      PRIMARY KEY (PARENT_NAME, CHILD_NAME),
      FOREIGN KEY (PARENT_NAME) REFERENCES PARENT(PARENT_NAME)
      ON UPDATE CASCADE
      ON DELETE CASCADE);

    INSERT INTO PARENT VALUES("PARENT A","Some Parent");

    INSERT INTO CHILD VALUES("PARENT A","CHILD A","Some Child");
    INSERT INTO CHILD VALUES("PARENT A","CHILD B","Some Child");
    INSERT INTO CHILD VALUES("PARENT A","CHILD C","Some Child");

    INSERT INTO CHILD VALUES("PARENT B","CHILD D","Non-present Parent");

    DELETE FROM PARENT WHERE PARENT_NAME = "PARENT A";

    SELECT * FROM CHILD;

Кроме того,

    mysql> SHOW VARIABLES LIKE "%version%";
    +-------------------------+---------------------+
    | Variable_name           | Value               |
    +-------------------------+---------------------+
    | protocol_version        | 10                  |
    | version                 | 5.1.41-3ubuntu12.10 |
    | version_comment         | (Ubuntu)            |
    | version_compile_machine | i486                |
    | version_compile_os      | debian-linux-gnu    |
    +-------------------------+---------------------+
    5 rows in set (0.00 sec)

Происходят две вещи, которые, как я думал, будут другими.
* Во-первых, MySQL позволяет мне вставлять в CHILD значения, которые не совпадают с PARENT. Я думал, что ограничение внешнего ключа остановит это.
* Во-вторых, MySQL не удаляет записи PARENT A из CHILD, когда PARENT A удаляется из PARENT. Я думал, что каскадное заявление сделает это возможным.

Я чувствую, что упускаю что-то очевидное. Есть предложения?

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Вам необходимо указать использование движка InnoDB для таблиц. По умолчанию MySQL будет использовать таблицы MyISAM, которые понимают спецификации внешнего ключа в запросах «создать таблицу», но игнорируют сами ключи.

Если вы сделаете 'show create table PARENT', вы, скорее всего, увидите ENGINE=MyISAM.

0 голосов
/ 30 мая 2011

Вы используете InnoDB?MyISAM (движок по умолчанию в MySQL) не поддерживает внешние ключи, тогда как InnoDB поддерживает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...