11 декабря 2013
16363
Каскадное удаление, MySQL, триггеры

Каскадное удаление MySQL

PHP

В этом уроке я расскажу Вам, как автоматизировать каскадное удаление MYSQL записей из базы данных. Для примера рассмотрим базу с двумя таблицами (запись, комментарии). Запросы для создания таблиц можете увидеть ниже.

 

CREATE TABLE posts(
id INT NOT NULL AUTO_INCREMENT,
title CHAR(40),
content TEXT,
public_date DATE,
PRIMARY KEY (id)
);

CREATE TABLE comments(
id INT NOT NULL AUTO_INCREMENT,
post INT,
autor CHAR(20),
text CHAR(100),
PRIMARY KEY (id)
);

 

Для автоматического удаления всех комментариев перед удалением записи создаем следующий триггер:

CREATE TRIGGER auto_del BEFORE DELETE ON posts
FOR EACH ROW BEGIN
DELETE FROM comments WHERE post = OLD.id;
END;

 

Помимо этого, если база только создается и не принципиален конкретный тип таблиц, то создавая таблицы типа InnoDB можно задать внешние ключи и указать, как поступать с записями при удалении / обновлении записей родительской таблицы. Такая реализация каскадного удаления изображена ниже:

 

CREATE TABLE posts(
id INT NOT NULL AUTO_INCREMENT,
title CHAR(40),
content TEXT,
public_date DATE,
PRIMARY KEY (id)
) TYPE = InnoDB;

CREATE TABLE comments(
id INT NOT NULL AUTO_INCREMENT,
post INT,
autor CHAR(20),
text CHAR(100),
PRIMARY KEY (id),
FOREIGN KEY (post) REFERENCES posts (id)
ON UPDATE RESTRICT
ON DELETE CASCADE
) TYPE = InnoDB;

 

Здесь ключевое слово RESTRICT устанавливает запрет на редактирование значения ключа, пока есть соответствующие внешние ключи в дочерних таблицах.

 

На этом урок по реализации каскадного удаления окончен. Благодарю за внимание! Также существует интересная тема про удаление старых записей на PHP и MySQL, посмотрите! Может кому то, потребуется. Удачи!