多个事务中的MySQL重复条目

多个事务中的MySQL重复条目,mysql,Mysql,我尝试使用事务在两个表中插入数据(users&rights,对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 TRANSAC

我尝试使用事务在两个表中插入数据(users&rights,对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
mysql-u usr-h localhost-P 3306-P
如果名为“toto”的用户已经存在,我会得到一个重复的条目,并且没有插入行('toto','France','0123456789')和('toto','myApp',1),这是逻辑。 但在第一个事务上出现此重复输入错误时,下一个事务(用户“tata”)不会运行。用户“tata”未创建,但它不存在。。。 我知道我可以使用--force,但它会在我不想使用时创建一行('toto','myApp',1)。 是否有办法继续运行其他事务&而不是停止文件

谢谢你的帮助

这应该有效:

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 ;
这应该起作用:

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 ;

谢谢你的回答,但这不是我想要的。如果我添加Ignore关键字,则不会插入行('toto','France','0123456789'),但这行('toto','myApp',1)将是我不想插入的(表权限没有约束)。我想要的是,如果“toto”生成了一个重复的密钥,那么我既不在users中插入,也不在right中插入,而是转到下一个事务并插入“tata”。这很有意义。我更新了答案。希望这就是你想要的。谢谢你的回答,但这不是我想要的。如果我添加Ignore关键字,则不会插入行('toto','France','0123456789'),但这行('toto','myApp',1)将是我不想插入的(表权限没有约束)。我想要的是,如果“toto”生成了一个重复的密钥,那么我既不在users中插入,也不在right中插入,而是转到下一个事务并插入“tata”。这很有意义。我更新了答案。希望这就是你想要的。