Поддержка MySQL (wampserver phpmyadmin) для ON DELETE - PullRequest
0 голосов
/ 14 октября 2018

Я создал две таблицы зданий и комнат.

Я хочу, чтобы комнаты, которые будут удалены, если я удаляю здания, удаляются автоматически.

Я знаю, что этого можно достичь, используя ограничения внешнего ключа и используя 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.Если не то, что я должен использовать.

ПРИМЕЧАНИЕ. Я не хочу удалять и воссоздавать всю таблицу

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

В вашем случае, механизм хранения по умолчанию установлен на 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;
0 голосов
/ 14 октября 2018

Смена механизма хранения по умолчанию с MyISAM на InnoDB в phpmyadmin / variable / storage engine сделала свое дело.Однако таблицы должны быть созданы снова.

Спасибо fancyPant , Tim Biegeleisen

...