MySQL повторяющаяся запись в нескольких транзакциях - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь вставить данные в 2 таблицы (пользователи и права с уникальным ограничением users.name), используя транзакции, поэтому я получил SQL файл, подобный следующему:

START TRANSACTION;
INSERT INTO users(name, country, phone) VALUES ('toto', 'France', '0123456789');
INSERT INTO rights(user, app, isOk) VALUES('toto', 'myApp', 1);
COMMIT;

START TRANSACTION;
INSERT INTO users(name, country, phone) VALUES ('tata', 'USA', '1234567890');
INSERT INTO rights(user, app, isOk) VALUES('tata', 'myApp', 1);
COMMIT;

...

Я запускаю файл с командой:

mysql -u usr -h localhost -P 3306 -p < D:\mySqlFile.sql

Если пользователь с именем 'toto' уже существует, я получаю Дубликат записи и строки ('toto', 'France', '0123456789') и (' toto ',' myApp ', 1) не вставляются, что логично c. Но с этой повторяющейся ошибкой ввода в первой транзакции следующая транзакция (пользователь 'tata') не запускается. Пользователь 'tata' не создан, хотя он не существует ... Я знаю, что могу использовать --force, но он создаст строку ('toto', 'myApp', 1), пока я не хочу , Есть ли способ продолжить выполнение других транзакций и не остановить файл?

Спасибо за помощь!

1 Ответ

0 голосов
/ 03 апреля 2020

Это должно работать:

DELIMITER $$

CREATE PROCEDURE `sp_fail`()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    ROLLBACK;  -- rollback any error in the transaction
END;

START TRANSACTION;
INSERT INTO users(name, country, phone) VALUES ('toto', 'France', '0123456789');
INSERT INTO rights(user, app, isOk) VALUES('toto', 'myApp', 1);
COMMIT; -- this will not be executed
END$$

DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...