@immelnikoff
Изучаю БД

Как в хранимой функции гарантировать одновременное выполнение или одновременное невыполнение двух INSERT в разные таблицы?

В MySQL 5.7 имеются две таблицы:
СREATE TABLE Maerial(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255)
);
СREATE TABLE Maerial2(
material_id INT NOT NULL PRIMARY KEY,
date DATE,
FOREIGN KEY (material_id) REFERENCES Material (id)
);

Нужно сделать так, чтобы запись об одном объекте делалась сразу в две таблицы. Ситуация, когда запись сделана в таблицу Material, а в таблицу Material2 – нет (например, данные не прошли валидацию при INSERT), недопустима!
Предполагается, что внешнее приложение, которое будет писать в базу, должно писать через хранимую функцию (приложение должно получать обратно id записи). Я вижу эту функцию так:
CREATE FUNCTION insert_material (n VARCHAR(255), d DATE) RETURNS INT
BEGIN
DECLARE idd INT;
INSERT INTO Material(name) VALUE(n);
SET idd = LAST_INSERT_ID();
INSERT INTO Material2(material_id, date) VALUE(idd, d);
RETURN idd;
END

В идеале колонки первичных ключей этих таблиц должны быть идентичными. Но проблема в том, что второй INSERT в функции может не пройти... В этом случае нужно будет откатить первый INSERT. Как это сделать? Нужно гарантировать, чтобы записи одновременно делались в обе таблицы, либо одновременно не делались.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
coderisimo
@coderisimo
Используйте транзакции , в чем вопрос! )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы