2013-02-11 77 views
0

我有57K项与列comp_phone表(UNIQUE KEY Phonecomp_phone))现在我尝试这个时间柱Mysql的更换并删除旧条目

update uk_data set comp_phone= REPLACE(comp_phone,' ',' ') 

但因为我有独特的KEY本专栏我收到错误

[SQL] update uk_data set comp_phone= REPLACE(comp_phone,' ',' ') 

[Err] 1062 - Duplicate entry '01268 203***' for key 'Phone' 

所以我用

DELETE FROM uk_data WHERE comp_phone = '01268 203***' 

删除旧行。但是这正在很长,因为我不知道有多少行被复制后,更换所以是有一个简单的方法来更换和删除或覆盖旧条目

THX

+1

后, '时间' 为 '编辑' 的委婉说法!?!?! – Strawberry 2013-02-11 10:18:13

+0

您定义了一个唯一的密钥,因为您不需要重复的密钥。现在你的UPDATE语句会生成重复密钥,你正在寻找一种方法来忽略这个错误?这没有任何意义,我... – CodeZombie 2013-02-11 10:34:47

+0

@ZombieHunter是......这是发生,因为一些数字存储与,现在我想删除像01268 20.3 ,我已经有一个不带空格01268 20.3,有我面临的问题 – Harinder 2013-02-11 10:46:24

回答

1

测试此查询

CREATE TEMPORARY table Kratika 
(
    _id int, 
    _value varchar(50) 
); 

INSERT INTO Kratika 
SELECT 1, '1111222255' UNION 
SELECT 2, '1111222 255' UNION -- duplicate 
SELECT 3, '11112222 55' UNION -- duplicate 
SELECT 4, '1111222233'; -- not duplicate 

SELECT * FROM Kratika; 

DELETE FROM Kratika WHERE _value <> REPLACE(_value, ' ', '') ; 

SELECT * FROM Kratika; 

输出

1 1111222255 
2 1111222 255 
3 11112222 55 
4 1111222233 

-- Select after deletion of duplicate records 
    1 1111222255 
    4 1111222233 

编辑

如果您没有问题while循环,那么你可以测试这个(我不是一个MySQL开发人员,我不知道为什么MySQL的不是让我写while循环,所以创建PROC为同)

DROP PROCEDURE IF EXISTS test_kratik; 
delimiter ## 

CREATE PROCEDURE test_kratik 
(

) 
BEGIN 
DROP table IF EXISTS Kratika; 
CREATE TEMPORARY table Kratika 
(
    _id int, 
    _value varchar(50) 
); 

INSERT INTO Kratika 
SELECT 1, '1111222255' UNION 
SELECT 2, '1111222 255' UNION -- duplicate 
SELECT 3, '11112222 55' UNION -- duplicate 
SELECT 4, '1111222233'; -- not duplicate 

SELECT * FROM Kratika; 

SET @ID := 0; 
SET @DUP_ID := 0; 
SET @value := ''; 

WHILE @ID <= (SELECT MAX(_id) FROM kratika) DO 
    BEGIN 
     IF EXISTS(SELECT _id from kratika WHERE _id = @ID) THEN 
      BEGIN 
       SET @value = (SELECT REPLACE(_value, ' ', '') from kratika WHERE _id = @ID); 
       DELETE FROM kratika 
       WHERE REPLACE(_value, ' ', '') = @value 
       AND _id <> @ID; 
      END; 
     END IF; 
     SET @ID = @ID + 1; 
    END; 
END WHILE; 

UPDATE kratika 
SET _value = REPLACE(_value, ' ', '') 
WHERE _value <> REPLACE(_value, ' ', '') ; 

SELECT * FROM kratika; 

END ## 

delimiter ; 

CALL test_kratik(); 

更新这将是很好,如果你不想while循环使用....

DROP TABLE IF EXISTS Kratika; 

CREATE TEMPORARY table Kratika 
(
    _id int, 
    _value varchar(50) 
); 

INSERT INTO Kratika 
SELECT 1, '1111222255' UNION 
SELECT 2, '1111222 255' UNION -- duplicate 
SELECT 3, '11112222 55' UNION -- duplicate 
SELECT 4, '111122 2233'; -- not duplicate 

DROP TABLE IF EXISTS copy_temp; 

CREATE TEMPORARY table copy_temp 
(
    _id1 int, 
    _value1 varchar(50) 
); 

INSERT INTO copy_temp 
SELECT _id, _value FROM kratika; 

SELECT * FROM Kratika; 

DELETE FROM Kratika 
WHERE _id <> (SELECT _id1 FROM copy_temp 
WHERE REPLACE(_value, ' ', '') = REPLACE(_value1, ' ', '') 
Limit 1 
); 

UPDATE kratika 
SET _value = REPLACE(_value, ' ', '') 
WHERE _value <> REPLACE(_value, ' ', '') ; 


SELECT * FROM Kratika; 

输出

1 1111222255 
2 1111222 255 
3 11112222 55 
4 1111222233 

更新

1 1111222255 
4 1111222233 
+0

这将删除如果重复与否其中获得编辑没有母校的所有行....( – Harinder 2013-02-11 11:53:29

+0

@ Harinder如果第4项是'4 111122 2233',那么它将取代第4项删除也是正确的。所以你想用'1111222233'权保留呢? – vikas 2013-02-11 12:01:14

+0

如果u放置11112222 33,空间就将它删除,因为查询将删除与空间的所有东西 – Harinder 2013-02-11 12:04:25