处理mysql" ERROR 1062(23000)"

时间:2014-03-19 10:16:02

标签: mysql

我有一个数据批量表,它有很多重复的条目,它不应该有。要删除它,我正在使用" 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,set(fname,lname)是唯一的。

我的第一次尝试是简单的sql文件

INSERT INTO xyz (
        fname,
        lname
)
SELECT
        fname,
        lname
FROM
        abc;

明显的结果是:

ERROR 1062(23000)第3行:重复录入' A-B'关键词' uqn'

我的第二个涉及错误处理程序和程序(从许多博客中读取)

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)输出是"结束 - "而不是"结束 - 有错误"。这意味着甚至没有启动处理程序。可能是什么原因造成的?
2)是" handlerproc"第一次出错时会退出执行,或者继续检查另一条记录是否输入新表" xyz" ?
3)如遇第一次遇到错误,它将退出数据泵,如何编写该函数以实现完整的数据迁移。

感谢

1 个答案:

答案 0 :(得分:1)

您输入了重复项,可以考虑: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)所以它们不能在这两列上重复。因为它们是独一无二的。