1

私のコードでバグが発生し、データベーステーブルに重複したエントリが表示される可能性がありますが、大文字と小文字が異なります。MySQLを使用しています。

たとえば、この例では、2番目の行は追加されるべきではありませんでしたが、追加されました。

    ID    Name          Description
-------------------------------------
    1    HELLO WORLD    Saying hello
    2    Hello world    Saying hello

誤ったデータを修正するために、重複が発生した場合は常にフルネームが大文字になっている行を削除したいと思います。SQLで正規表現を実行できますか?それが最善の解決策ですか?どのように実行しますか?

表全体は次のとおりです。

'ADDRESSBOOK_GROUP'、'CREATE TABLE ADDRESSBOOK_GROUPID int(10)unsigned NOT NULL default''0''、 NAMEvarchar(255)collat​​e utf8_unicode_ci NOT NULL、 DESCRIPTIONtext collat​​e utf8_unicode_ci、 ADDRESSBOOK_IDint(10)default NULL、 TYPE int(10)unsigned NOT NULL default '' 1''、主キー(ID)、キー ADDRESSBOOK_IDADDRESSBOOK_ID))ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = DYNAMIC '

編集-また、ADDRESSBOOK_IDが「6」の場合にのみ重複チェックを実行したいことを前に述べたことを忘れています。

4

1 に答える 1

5

以下は、double が存在するすべての大文字の値を選択します

delete t.* from table_name t
inner join (
    select distinct t.id
    from table_name t
    left join table_name t2
        on t2.col_name = t.col_name
    where t.col_name LIKE BINARY UPPER(t.col_name)
) as a
    on a.id = t.id;

編集:

delete t.* from ADDRESSBOOK_GROUP t
inner join (
    select distinct t.ID
    from ADDRESSBOOK_GROUP t
    left join (
        select
            count(*) as n,
            NAME,
            ADDRESSBOOK_ID
        from ADDRESSBOOK_GROUP
        group by 
            NAME,
            ADDRESSBOOK_ID
    ) as t2
        on t2.name = t.name
        and t2.ADDRESSBOOK_ID = t.ADDRESSBOOK_ID
    left join ADDRESSBOOK_GROUP t_n
        on t_n.ID = t.ID
        and t_n.NAME REGEXP ('^[0-9]+$') 
    where 
        t.NAME like binary upper(t.NAME)
        and t_n.ID is null
        and t2.n > 1
) as a
    on a.ID = t.ID
where t.ADDRESSBOOK_ID = 6;
于 2012-12-12T11:56:39.973 に答える