0

私はこれに対する答えを探し回り、 IGNORE と WHERE NOT EXISTS に出くわしましたが、どちらも私が達成しようとしていることとは少し異なるようです。私の MYSQL テーブルは次のように表示されます。

id(自動インクリメント INT)、文字名(VARCHAR)、文字領域(VARCHAR)、文字領域(VARCHAR)

私のデータは、データベースに既にあるものも含め、ゲームのすべてのキャラクターを返す Web サイトから取得されます。

すべてのキャラクターのリストを保持したいのですが、重複はありません。私の問題は、同じ名前が異なる地域/領域の組み合わせで表示される可能性があるため、重複しているかどうかを判断する前に、キャラクターの名前、領域、および領域を比較する必要があるようです。

次のように、3 つの非自動インクリメント列のすべての値を比較してみました。

REPLACE INTO characters ( charactername, characterregion, characterrealm) VALUES ('Peter','AMERICA','Realm1') WHERE NOT EXISTS(SELECT * FROM characters WHERE charactername='Peter' AND characterregion='AMERICA' AND characterrealm='Realm1')

ただし、構文が正しくないため、MYSQL エラーが返されます。INSERT IGNORE INTO も試しました...ただし、ID値のみをチェックしているようです。自動インクリメントに設定されているため、IDを確認する必要はまったくないと思います。

どんな助けでも大歓迎です。助けになれば、私はこれの他の部分にPHPを使用しています。再度、感謝します。

4

1 に答える 1

1

3 つの列すべてに複合インデックスを追加するだけです。

alter ignore table mytable add unique index(charactername, characterregion, characterrealm);

それからする

INSERT INTO characters (charactername, characterregion, characterrealm)  
VALUES ('Peter','AMERICA','Realm1')  
ON DUPLICATE KEY 
UPDATE
charactername='Peter1',characterregion='AMERICA1',characterrealm='Realm11'

更新は、3 つの列すべてが同一である場合にのみトリガーされます。または、INSERT だけを実行しても、3 つの列すべてが同一である場合は失敗します。

于 2013-11-10T12:52:17.977 に答える