質問
興味のある2つの列を持つMySQLデータベーステーブルがあります。個別にそれぞれ重複させることはできますが、同じ値を持つ両方が重複してはなりません。
stone_id
は、各 upsharge
のタイトルが異なる限り、またその逆である限り、重複することができます。しかし、たとえば stone_id
= 412および upcharge_title
=" sapphire"その組み合わせは一度しか発生しません。
これで問題ありません:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "ruby"
これは大丈夫ではありません:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "sapphire"
両方のフィールドで重複を検出するクエリはありますか?可能であれば、それを許可しないようにデータベースを設定する方法はありますか?
MySQLバージョン4.1.22を使用しています
解決
2つのフィールド間に複合キーを設定する必要があります。これには、各行に一意のstone_idとupcharge_titleが必要です。
既存の重複を見つける限り、これを試してください:
select stone_id,
upcharge_title,
count(*)
from your_table
group by stone_id,
upcharge_title
having count(*) > 1
他のヒント
" ALTER IGNORE"を使用して、ユニークなインデックスを追加すると便利です。重複を削除して、独自のレコードを適用します。したがって、構文は次のようになります。
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
これにより、一意の制約が効果的に追加されます。つまり、重複するレコードは存在せず、IGNOREは既存の重複を削除します。
eh ALTER IGNOREの詳細については、 http:// mediakeyをご覧ください。 .dk /〜cc / mysql-remove-duplicate-entries /
更新:@Inquisitiveから、MySqlのバージョンではこれが失敗する可能性があることが通知されました> 5.5:
MySQLでは失敗します> 5.5およびInnoDBテーブル、およびPercona 彼らのInnoDB高速インデックス作成機能[ http://bugs.mysql.com/bug。 php?id = 40344] 。この場合 最初に
set session old_alter_table = 1
を実行し、次に上記のコマンドを実行します 正常に動作します
更新- ALTER IGNORE
5.7で削除
MySQL 5.6.17の時点で、IGNORE句は非推奨になり、その使用 警告を生成します。 IGNOREはMySQL 5.7で削除されました。
MySQL開発者が提供する 2つの選択肢:
- 一意のフィールドでグループ化し、上記のように削除します
- 新しいテーブルの作成、一意のインデックスの追加、
INSERT IGNORE
の使用:例:
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;
ただし、テーブルのサイズによっては、これは実用的ではない場合があります
このような重複を見つけることができます。
Select
stone_id, upcharge_title, count(*)
from
particulartable
group by
stone_id, upcharge_title
having
count(*) > 1
重複を見つけるには:
select stone_id, upcharge_title from tablename group by stone_id, upcharge_title having count(*)>1
今後これを避けるように制約するには、これら2つのフィールドに複合一意キーを作成します。
偶然にも、テーブルの複合一意制約により、そもそもこれが発生することはありません。
ALTER TABLE table
ADD UNIQUE(stone_id, charge_title)
(これは有効なT-SQLです。MySQLについてはわかりません。)
このSO投稿は私を助けましたが、私も行の1つを削除して保持する方法を知りたいと思いました...重複した行を削除して1つを保持するPHPソリューションがあります(私の場合は2列しかありませんでした重複するカテゴリの関連付けをクリアする機能にあります)
$dupes = $db->query('select *, count(*) as NUM_DUPES from PRODUCT_CATEGORY_PRODUCT group by fkPRODUCT_CATEGORY_ID, fkPRODUCT_ID having count(*) > 1');
if (!is_array($dupes))
return true;
foreach ($dupes as $dupe) {
$db->query('delete from PRODUCT_CATEGORY_PRODUCT where fkPRODUCT_ID = ' . $dupe['fkPRODUCT_ID'] . ' and fkPRODUCT_CATEGORY_ID = ' . $dupe['fkPRODUCT_CATEGORY_ID'] . ' limit ' . ($dupe['NUM_DUPES'] - 1);
}
(NUM_DUPESの制限-1)は、単一行を保持するものです...
ありがとうございます