2017-03-09 1 views
1

ユニークな列url varchar(4)を持っていて、それを一意のランダムな文字列に更新したいが、重複した項目に問題がある。 このようなループを作成したいのですが、同じテーブルを2回ターゲティングすることに問題があります。存在するステートメントを使用してユニークな文字列でテーブルの列を更新

UPDATE IGNORE word SET url = (SELECT GROUP_CONCAT(SUBSTRING('1234567890qwertyuiopasdfghjklzxcvbnm' , 1+ FLOOR(RAND()*LENGTH('1234567890qwertyuiopasdfghjklzxcvbnm'))  ,1) SEPARATOR '') 
FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS dummy_tbl) 
WHERE EXISTS (SELECT url FROM word WHERE url IS NULL); 

単一のクエリで自分の列を埋める最も良い方法は何ですか?

答えて

1

あなたはEXISTS句を削除し、ちょうど直接NULL行を更新する必要があります。

UPDATE 
IGNORE word 
SET url = ... 
WHERE url IS NULL; 

だからあなたの完全なクエリは次のようになります。

UPDATE 
IGNORE word 
SET url = 
    (SELECT GROUP_CONCAT(SUBSTRING('1234567890qwertyuiopasdfghjklzxcvbnm', 
     1+ FLOOR(RAND()*LENGTH('1234567890qwertyuiopasdfghjklzxcvbnm')),1) SEPARATOR '') 
    FROM 
     (SELECT 1 
      UNION SELECT 2 
      UNION SELECT 3 
      UNION SELECT 4) AS dummy_tbl) 
WHERE url IS NULL; 
+0

私は追加する前に句をEXISTSことをしようとしたが、それはありませんそれらの一部だけをすべて更新し、その重複したエントリがNULLのままになったとき。だから私は基本的にその存在とループを追加したい。 (私は250K行とalter table urlカラムを持っています) – MarksW

+0

同じ文字x3サイズのサブ文字列と長さを拡張して、それを単一のクエリで更新しますが、将来のプロジェクトで正しいループコードを見たいと思っています。 – MarksW

+0

'UPDATE'文をループすることはできません。これを行うためのスクリプトやストアドプロシージャを記述する必要があります。 –

関連する問題