ストアドプロシージャ内から失敗した一意のインデックスを見つけるにはどうすればよいですか?
単一列の主キーと3つの単一列の一意のインデックスを持つテーブルを作成しました。
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回呼び出しました。
1回目のINSERT試行が成功しました
-- 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';
col1が一意でないため、2回目のINSERT試行が失敗します
-- 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';
col2が一意でないため、3回目のINSERT試行が失敗します
-- 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';
col3が一意でないため、4番目のINSERT試行は失敗します
-- 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';
5回目のINSERT試行が成功しました
-- 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';
ストアドプロシージャ内から失敗した一意のインデックスを見つけるには、ストアドプロシージャで何をする必要がありますか?
前もって感謝します。