mysql(wampserver phpmyadmin)支持on delete

oprakyz7  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(329)

我已经创建了两个table和房间。
我想删除的房间,如果我删除一个自动删除的建筑物。
我知道这可以通过使用外键约束和ondelete级联来实现
我就是这样做的。

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

执行delete时,不会级联delete。这是phpmyadmin的问题还是我的代码中有什么错误(可能性很小)?
phpmyadmin也支持delete语句。如果没有,我应该用什么。
注意:我不想删除并重新创建整个表

jexiocij

jexiocij1#

将phpmyadmin/variable/storage engine中的默认存储引擎从myisam更改为innodb就成功了。但是,必须再次创建表。
谢谢fancypant,tim biegeleisen

qxgroojn

qxgroojn2#

在您的情况下,默认存储引擎设置为myisam。myisam不支持外键约束。来自文档:
对于不支持外键的存储引擎(如myisam),mysql server解析并忽略外键规范。
在创建表时,可以显式指定要用于表的存储引擎。其中一个常见的选择是innodb(使用 ENGINE = INNODB ). 您可以使用以下查询来创建表:

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;

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

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

相关问题