Php Mysql替换和删除旧条目
我有一个包含57k个条目的表,其中包含列comp_phone(唯一键Php Mysql替换和删除旧条目,php,mysql,replace,Php,Mysql,Replace,我有一个包含57k个条目的表,其中包含列comp_phone(唯一键phone(comp_phone)),现在我尝试使用 update uk_data set comp_phone= REPLACE(comp_phone,' ',' ') 但因为我在这个列上有唯一的键,所以我得到了一个错误 [SQL] update uk_data set comp_phone= REPLACE(comp_phone,' ',' ') [Err] 1062 - Duplicate entry '01268
phone
(comp_phone
)),现在我尝试使用
update uk_data set comp_phone= REPLACE(comp_phone,' ',' ')
但因为我在这个列上有唯一的键,所以我得到了一个错误
[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测试此查询
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;
已编辑
如果您对while循环没有问题,那么您可以对此进行测试(我不是MySQL开发人员,我不知道为什么MySQL不允许我编写while循环,所以为相同的程序创建了proc)
更新后
1 1111222255
4 1111222233
“时间”是“编辑”的委婉说法吗!?!?!您定义了一个唯一的键,因为您不需要重复的键。现在您的UPDATE语句生成了重复的密钥,您正在寻找忽略此错误的方法吗?这对我来说没有意义…@僵尸猎人是的。。。发生这种情况是因为一些数字是用存储的,现在我想删除类似的01268 203000,我已经有一个没有空间01268 203000,在那里,我面对着大海problem@Harinder你查过我的电话了吗ans@Harinder查看更新后的答案,不进行循环。这将删除所有被编辑的行,无论其是否重复;(@Harinder如果第四个条目是
4 111122 2233
,那么它也会删除该条目。所以你想用1111222233
保留它,对吗?如果你用空格放置11112222 33,它会删除第四个条目,因为查询会用空格删除所有内容。你可以用而或for loop
吗hp希望在mysql服务器上实现这一点,因此需要一些东西(
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();
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