2011-04-01 21 views
4

をutf8_unicode_ceするため、どのように私はutf8_unicode_ceするutf8_binから照合順序を変更できますか? 「重複エントリエラー」のため、通常の「alter」クエリは機能しません。例えば、2つのエントリのMySQL:utf8_binから変更照合順序が完全なテーブルを考えると

David Hussa 

David Hußa 

があります私は、彼らが同じである知っています。エントリを "マージ"するようにMySQLに指示するエレガントな方法はありますか?エントリのIDは他のテーブルで参照として使用されているので、これもMySQLが尊重しなければならないことに言及しておきます。または、私はこれを長くて迷惑なやり方でやらなければならないのですか?手動ですべての複製をマージして照合順序を変更することを意味しますか?

テーブルは次のようになります。

delimiter $$ 

CREATE TABLE `authors` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) COLLATE utf8_bin NOT NULL, 
    `count` int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name_UNIQUE` (`name`), 
    FULLTEXT KEY `name_FULLTEXT` (`name`) 
) ENGINE=MyISAM AUTO_INCREMENT=930710 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Stores all authors from dblp.xml.'$$ 

答えて

5

あなたが重複したエントリを削除することができます:あなたのテーブルが大きい場合、これは長い時間がかかることが

DELETE a2 
FROM authors a1 
JOIN authors a2 
ON  a2.name COLLATE UTF8_GENERAL_CI = a1.name COLLATE UTF8_GENERAL_CI 
     AND a2.id < a1.id 

注意を。

これを行う方が良いでしょう:

  • ドロップUNIQUE制約

  • 変更照合

  • name

  • に平野、非ユニーク索引を作成します

    クエリを実行します(COLLATE句なし):

    DELETE a2 
    FROM authors a1 
    JOIN authors a2 
    ON  a2.name = a1.name 
         AND a2.id < a1.id 
    
  • UNIQUE制約を再作成したインデックス

  • をドロップします。

参照テーブルを更新するには、エントリを削除する前に、このクエリを実行します。すべての参照テーブルの

UPDATE child c 
JOIN (
     (
     SELECT name COLLATE utf8_unicode_ci AS name_ci, MAX(id) AS mid 
     FROM authors 
     GROUP BY 
       name_ci 
     ) pa 
     JOIN authors a 
     ON  a.name COLLATE utf8_unicode_ci = name_ci 
     ) 
ON  c.author = a.id 
SET  author = mid; 

を。

+0

ありがとうございます。しかし、質問が残っています:名前のIDが別のテーブルで使用されていて、その名前が重複していた場合。これは "other" idによって自動的に更新されますか?私は、 "John Doe"がid = 1であり、 "JohnDoé"がid = 2であり、第2のIDが失われている、という意味ですか? – Aufwind

+0

@Aufwind:申し訳ありませんが、最初は何を意味するのか分かりませんでした。いいえ、自動的に名前が更新されることはありません。あなたは今私が書くだろうクエリを実行する必要があります。 – Quassnoi

+0

ありがとうございます。それは滑らかに働いた。私のような他の嫌なことについては、私はこれらのコメントを追加したい。子供は参照テーブルの名前であり、cはその略語であり、例えば、 c.authorは2行目の最後の行にあります。私は自分自身のためにそれを理解する時間を取った。 ^^ – Aufwind

関連する問題