代码之家  ›  专栏  ›  技术社区  ›  pr0p

MySQL(wampserver phpmyadmin)支持ON DELETE

  •  1
  • pr0p  · 技术社区  · 6 年前

    我已经创建了两个桌子和房间。

    我想删除的房间,如果我删除一个自动删除的建筑物。

    我知道这可以通过使用外键约束和 删除级联时

    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的问题还是我的代码中有什么错误(可能性很小)?

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Madhur Bhaiya    6 年前

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

    对于不支持外键的存储引擎(如MyISAM), MySQL服务器解析并忽略外键规范。

    在创建表时,您可以 明确地 指定 which storage engine to use 为了桌子。其中一个常见的选择是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;
    
        2
  •  1
  •   pr0p    6 年前

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

    谢谢 fancyPant Tim Biegeleisen