MySQL (wampserver phpmyadmin) 支持删除时

MySQL (wampserver phpmyadmin) support for ON DELETE

我创建了两个 tables 建筑和房间。

如果我删除建筑物,我希望房间也被删除。

我知道这可以使用外键约束和使用 ON DELETE CASCADE

来实现

这是我的做法。

CREATE TABLE buildings (
    building_no INT PRIMARY KEY AUTO_INCREMENT,
    building_name VARCHAR(255) NOT NULL,
    address VARCHAR(255) NOT NULL
);

CREATE TABLE rooms (
    room_no INT PRIMARY KEY AUTO_INCREMENT,
    room_name VARCHAR(255) NOT NULL,
    building_no INT NOT NULL,
    FOREIGN KEY (building_no)
        REFERENCES buildings (building_no)
        ON DELETE CASCADE
);

INSERT INTO buildings(building_name,address)
VALUES('ACME Headquaters','3950 North 1st Street CA 95134'),
      ('ACME Sales','5000 North 1st Street CA 95134');

INSERT INTO rooms(room_name,building_no)
VALUES('Amazon',1),
      ('War Room',1),
      ('Office of CEO',1),
      ('Marketing',2),
      ('Showroom',2);

执行删除时,删除不会级联。 是 phpmyadmin 的问题还是我的代码有什么问题(这种可能性很小)?

phpmyadmin 也支持 ON DELETE 语句。如果不是我应该使用什么。

注意:我不想删除并重新创建整个 table

将 phpmyadmin/variable/storage 引擎中的默认存储引擎从 MyISAM 更改为 InnoDB 成功了。但是必须重新创建表。

谢谢fancyPant, Tim Biegeleisen

在您的情况下,默认存储引擎设置为 MyISAM。 MyISAM 不支持外键约束。来自 Docs:

For storage engines that do not support foreign keys (such as MyISAM), MySQL Server parses and ignores foreign key specifications.

在创建 table 时,您可以显式 为 table 指定 which storage engine to use。一种常见的选择是 InnoDB(使用 ENGINE = INNODB)。您可以使用以下查询来创建 tables:

CREATE TABLE buildings (
    building_no INT PRIMARY KEY AUTO_INCREMENT,
    building_name VARCHAR(255) NOT NULL,
    address VARCHAR(255) NOT NULL
) ENGINE = INNODB;

CREATE TABLE rooms (
    room_no INT PRIMARY KEY AUTO_INCREMENT,
    room_name VARCHAR(255) NOT NULL,
    building_no INT NOT NULL,
    FOREIGN KEY (building_no)
        REFERENCES buildings (building_no)
        ON DELETE CASCADE
) ENGINE = INNODB;

如果您的 table 已经创建,并且您希望更改引擎(而不是再次创建新的 table),您可以使用 Alter Table 命令。

ALTER TABLE buildings ENGINE = InnoDB;
ALTER TABLE rooms ENGINE = InnoDB;