Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL处理重复键错误插入到具有多个唯一索引的表中;非多列唯一索引_Mysql_Mysql Error 1062_Unique Index - Fatal编程技术网

MySQL处理重复键错误插入到具有多个唯一索引的表中;非多列唯一索引

MySQL处理重复键错误插入到具有多个唯一索引的表中;非多列唯一索引,mysql,mysql-error-1062,unique-index,Mysql,Mysql Error 1062,Unique Index,如何从存储过程中查找失败的唯一索引 我创建了一个具有单列主键和三个单列唯一索引的表: CREATE TABLE tableName ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, col1 VARCHAR(50) NOT NULL, col2 VARCHAR(50) NOT NULL, col3 VARCHAR(50) NOT NULL, PRIMARY KEY (id), UNIQUE INDEX id_UNIQUE (id ASC

如何从存储过程中查找失败的唯一索引

我创建了一个具有单列主键和三个单列唯一索引的表:

CREATE TABLE tableName (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  col1 VARCHAR(50) NOT NULL,
  col2 VARCHAR(50) NOT NULL,
  col3 VARCHAR(50) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE INDEX id_UNIQUE (id ASC),
  UNIQUE INDEX col1_UNIQUE (col1 ASC),
  UNIQUE INDEX col2_UNIQUE (col2 ASC),
  UNIQUE INDEX col3_UNIQUE (col3 ASC)
) ENGINE = InnoDB;
我已创建一个存储过程来处理错误“1062”:“密钥%d的重复条目%s”:

DELIMITER $$
CREATE PROCEDURE insertRecord (
        col1Value   VARCHAR(50), 
        col2Value   VARCHAR(50), 
        col3Value   VARCHAR(50), 
    OUT idValue     INT,
    OUT errColName  VARCHAR(50)
) BEGIN
    DECLARE EXIT HANDLER FOR 1062 BEGIN
        SET errColName = 'Insert Column Name Here';
    END;

    INSERT tableName SET
        col1 = col1Value, 
        col2 = col2Value, 
        col3 = col3Value;

    SET idValue = LAST_INSERT_ID();
END;
$$
DELIMITER ;
我使用不同的数据调用了存储过程5次,以返回不同的结果:

第一次插入尝试成功

-- Initialize parameters
SET @col1Val = 'MySQL', 
    @col2Val = 'Is', 
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 1st Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = 1, @ErrColName = NULL
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'For', 
    @col3Val = 'Life', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 5th Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = 5, @ErrColName = NULL
SELECT @Id '@Id', @ErrColName '@ErrColName';
第二次插入尝试失败,因为col1不是唯一的

-- Re-initialize parameters
SET @col1Val = 'MySQL', -- Intended to generate an error
    @col2Val = 'Is', 
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 2nd Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col1'
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'Is', -- Intended to generate an error
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 3rd Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col2'
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'For', 
    @col3Val = 'Cool', -- Intended to generate an error
    @Id = NULL, 
    @ErrColName = NULL;
-- 4th Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col3'
SELECT @Id '@Id', @ErrColName '@ErrColName';
第三次插入尝试失败,因为col2不是唯一的

-- Re-initialize parameters
SET @col1Val = 'MySQL', -- Intended to generate an error
    @col2Val = 'Is', 
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 2nd Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col1'
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'Is', -- Intended to generate an error
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 3rd Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col2'
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'For', 
    @col3Val = 'Cool', -- Intended to generate an error
    @Id = NULL, 
    @ErrColName = NULL;
-- 4th Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col3'
SELECT @Id '@Id', @ErrColName '@ErrColName';
第四次插入尝试失败,因为col3不是唯一的

-- Re-initialize parameters
SET @col1Val = 'MySQL', -- Intended to generate an error
    @col2Val = 'Is', 
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 2nd Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col1'
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'Is', -- Intended to generate an error
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 3rd Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col2'
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'For', 
    @col3Val = 'Cool', -- Intended to generate an error
    @Id = NULL, 
    @ErrColName = NULL;
-- 4th Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = NULL, @ErrColName = 'col3'
SELECT @Id '@Id', @ErrColName '@ErrColName';
第五次插入尝试成功

-- Initialize parameters
SET @col1Val = 'MySQL', 
    @col2Val = 'Is', 
    @col3Val = 'Cool', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 1st Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = 1, @ErrColName = NULL
SELECT @Id '@Id', @ErrColName '@ErrColName';
-- Re-initialize parameters
SET @col1Val = 'SQL', 
    @col2Val = 'For', 
    @col3Val = 'Life', 
    @Id = NULL, 
    @ErrColName = NULL;
-- 5th Insert Attempt
CALL insertRecord(@col1Val, @col2Val, @col3Val, @Id, @ErrColName);
-- Expected result: @Id = 5, @ErrColName = NULL
SELECT @Id '@Id', @ErrColName '@ErrColName';
我需要在存储过程中执行什么操作才能从存储过程中查找失败的唯一索引

提前谢谢。

我在下面找到了答案。这并不理想,但确实解决了问题

以下是应用的解决方案:

    ...
    DECLARE EXIT HANDLER FOR 1062 BEGIN
        -- Check if col1Value is already in use
        IF EXISTS (
            SELECT 1
            FROM tableName
            WHERE col1 = col1value
            LIMIT 1
        ) THEN
            SET errColName = 'Col1';

        -- Check if col2Value is already in use
        ELSEIF EXISTS (
            SELECT 1
            FROM tableName
            WHERE col2 = col2value
            LIMIT 1
        ) THEN
            SET errColName = 'Col2';

        -- Check if col3Value is already in use
        ELSEIF EXISTS (
            SELECT 1
            FROM tableName
            WHERE col3 = col3value
            LIMIT 1
        ) THEN
            SET errColName = 'Col3';

        END IF;
    END;
    ...