0

Phone私は列comp_phone(UNIQUE KEY ( ))を持つ57kエントリのテーブルを持っています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***'

古い行を削除します。しかし、REPLACE後に重複する行の数がわからないため、これには非常に時間がかかります。古いエントリをREPLACEして削除または上書きする簡単な方法はありますか?

どうも

4

1 に答える 1

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
于 2013-02-11T10:56:24.690 に答える