2017-05-30 11 views
1

次のような質問のカップル:のMySQL:列に重複のn個の数を制限

  1. は、特定の列に重複の数を制限する方法はありますか?列のプロパティや設定はありますか?

  2. データをインポートした後に実行すると、その列の最初のn個の重複をそのまま残すことによって重複を削除するSQLクエリがありますか?

この点に関するご意見とご指摘をお待ちしております。

+0

「n」が「1」と異なる場合、最初の質問に対する回答は「いいえ」です。 – axiac

+2

1)重複を停止することはできますが、4重複のみを許可することはできません。 2)YES – RiggsFolly

+0

2つのユーザ変数を使用して 'row_number(over)(何かによってユニークな順序を作るカラム)をシミュレートすると、重複をnに制限できます。 – xQbert

答えて

0

1:

多分それが最善の解決策ではなく、オプションのように、あなたはこのように、トリガーを使用することができます。

create table test (msg varchar(25)); 

delimiter | 
create trigger test_duplicates before insert on test 
for each row 
begin 
    if (select count(*) from test where msg = new.msg) >= 3 then 
    signal sqlstate '45000' set message_text = 'You cannot insert 4th duplicate.'; 
    end if; 
end; 
| 
delimiter ; 

そして、それはこのように動作します:

mysql> insert into test values ('this is test'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into test values ('this is test'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into test values ('this is test'); 
Query OK, 1 row affected (0.02 sec) 

mysql> insert into test values ('this is test'); 
ERROR 1644 (45000): You cannot insert 4th duplicate. 
mysql> select * from test; 
+--------------+ 
| msg   | 
+--------------+ 
| this is test | 
| this is test | 
| this is test | 
+--------------+ 
3 rows in set (0.00 sec) 

2:

目的のデータをインポートして

- あなたは、このように、重複を削除してからトリガーを有効そして、すべての重複をインポートし、インポートの初めにトリガを無効にすることができます

select * from test; 
+----------------+ 
| msg   | 
+----------------+ 
| this is test | 
| this is test | 
| this is test | 
| this is test | 
| this is test 2 | 
| this is test 2 | 
| this is test 2 | 
| this is test 2 | 
| this is test 3 | 
| this is test 3 | 
| this is test 3 | 
| this is test 4 | 
+----------------+ 

一時テーブルに重複を入れて:

create temporary table tmp like test; 
insert into tmp select msg from test group by msg having count(msg) > 3; 
select * from tmp; 
+----------------+ 
| msg   | 
+----------------+ 
| this is test | 
| this is test 2 | 
+----------------+ 

これで、重複が確認でき、確実に確認でき、一時表のデータを使用して削除できます。

これでトリガーを有効にすることができます。

はい、これは長い方法ですが、少し遅いかもしれませんが、別の方法です!

+0

これは本当にうまく動作しますが、大きなデータをインポートすると、その状態で終了していると思います。重複を無視し、LOAD DATA INFILE 'some.csv'の実行を続行する方法があります。 – UM1979

+0

はい、本当です。そうです。私の答えを更新し、インポートブロックを追加しました... –

+0

はい、ありがとうございます。しかし、これは3つの数字の "これはテストです"を保持する必要があります。私の要件は常にデータがインポートされているので私はそれを見て、私たちは毎回それを制限する必要がありますあなたが述べたように、私はポスト操作を3以上を削除するアクションを作成する必要があります。 – UM1979

関連する問題