簡體   English   中英

處理mysql“錯誤1062(23000)”

[英]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)是唯一的。

我的第一次嘗試是簡單的sql文件

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM