我有一个数据批量表,它有很多重复的条目,它不应该有。要删除它,我正在使用" 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)是唯一的。
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)如遇第一次遇到错误,它将退出数据泵,如何编写该函数以实现完整的数据迁移。
感谢
答案 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)
所以它们不能在这两列上重复。因为它们是独一无二的。