[英]Handling mysql “ERROR 1062 (23000)”
我有一個帶有大量重復條目的數據批量表,它不應該具有重復條目。 為了消除這一點,我將數據從該表遷移到具有“ UNIQUE”約束的新表中。
例如:假設原始表為“ abc”,新表為“ xyz”。
mysql>desc abc;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| fname | varchar(8) | NO | | NULL | |
| lname | varchar(8) | NO | | NULL | |
+-------+------------+------+-----+---------+----------------+
mysql> select fname,lname from abc;
+-------+-------+
| fname | lname |
+-------+-------+
| A | B |
| A | B |
| A | B |
| C | D |
| C | D |
+-------+-------+
5 rows in set (0.00 sec)
mysql> create table xyz (id INT PRIMARY KEY AUTO_INCREMENT, fname VARCHAR(8) NOT NULL, lname VARCHAR(8) NOT NULL,UNIQUE KEY uqn (fname, lname));
在新表中:xyz,集合(fname,lname)是唯一的。
INSERT INTO xyz (
fname,
lname
)
SELECT
fname,
lname
FROM
abc;
第3行出現錯誤1062(23000):鍵“ uqn”的條目“ AB”重復
drop procedure if exists handlerproc ;
DELIMITER //
create procedure handlerproc(OUT p_end VARCHAR(10))
begin
declare CONTINUE handler for sqlstate '23000' SET @b = '- With Errors';
INSERT INTO xyz
(
fname,
lname
)
SELECT
fname,
lname
FROM
abc;
set p_end := concat('The End ',@b);
end;
//
DELIMITER ;
call handlerproc(@a);
select (@a);
(@一種)
結束 -
1)輸出是“ The End-”,而不是“ The End-With Errors”。 這意味着處理程序甚至沒有啟動。 這可能是什么原因?
2)“ handlerproc”會在遇到第一個錯誤時退出執行,還是繼續檢查是否有其他記錄要輸入新表“ xyz”中?
3)萬一第一次遇到錯誤就要退出datapump,我該如何編寫函數來完成數據遷移。
謝謝
如果您輸入了重復項,則可以考慮: INSERT IGNORE INTO ....SELECT FROM ...
嘗試:
INSERT IGNORE INTO xyz (
fname,
lname
)
SELECT
fname,
lname
FROM
abc
或INSERT INTO ....SELECT FROM ...ON DUPLICATE KEY...
INSERT INTO xyz (
fname,
lname
)
SELECT
fname,
lname
FROM
abc
ON DUPLICATE KEY UPDATE fname= ...., lname= ....
編輯:您有UNIQUE KEY uqn (fname, lname)
所以它不能在這兩列上一起重復。 因為它們是獨特的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.