Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql替换和删除旧条目_Php_Mysql_Replace - Fatal编程技术网

Php Mysql替换和删除旧条目

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

我有一个包含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 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