需要MYSQL外键执行

时间:2011-05-30 17:38:06

标签: mysql foreign-keys

考虑以下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中的任何内容都不匹配的值。我认为外键克制会阻止这种情况的发生。
*第二个是当PARENT ACHILD删除时,MySQL不会从PARENT A删除PARENT条记录。我认为级联声明会使这种情况发生。

我觉得我错过了一些明显的东西。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您需要为表格指定InnoDB引擎。默认情况下,MySQL将使用MyISAM表,它们了解“创建表”查询中的外键规范,但忽略了键本身。

如果您执行'show create table PARENT',您很可能会看到ENGINE=MyISAM

答案 1 :(得分:0)

您使用的是InnoDB吗? MyISAM(MySQL中的默认引擎)不支持外键,而InnoDB支持外键。