0

SQL に対して何千ものクエリを実行する予定であり、フィールド「ドメイン」の重複を防ぐ必要があります。これまでにこれを行う必要はありませんでした。

4

6 に答える 6

8

フィールド「ドメイン」に「UNIQUE」制約を作成することをお勧めします。データベースに同じドメインを持つ 2 つの行を作成すると、この制約によりエラーが発生します。説明については、W3C スクールのこのチュートリアルを参照してください-

http://www.w3schools.com/sql/sql_unique.asp

これで問題が解決しない場合は、使用することを選択したデータベース (MySql?) を明確にしてください。

注: この制約は、プログラミング言語としての PHP の選択とは完全に別のものであり、SQL データベース定義の問題です。この制約を SQL で表現することの大きな利点は、ユーザーがデータベースからデータをインポート/エクスポートしたり、アプリケーションにバグがあったり、別のアプリケーションがデータベースを共有している場合でも、データベースを信頼して制約を保持できることです。

于 2008-11-09T22:38:41.913 に答える
1

これが絶対的なデータベース整合性要件である場合(変更される可能性は低く、既存のデータにもこの問題はありません)、データベースで一意の制約を適用します。

ユーザーに通知するために試行の前後にそれを検出する限り、使用できるいくつかの手法があります。

于 2008-11-09T22:46:01.043 に答える
1

データはどこから来ていますか?これは、1 回だけ、または数回、または頻繁に実行したいものですか? domain-value が既に存在する場合、挿入をスキップしますか、それとも別のことを行いますか (つまり、カウンターをインクリメントしますか)?

あなたの答えに応じて、多くの可能な解決策があります。

  1. データを事前に並べ替え、重複を排除してから挿入します (比較的静的なデータ、最初は空のテーブルを想定しています)。

  2. PHP で連想配列をローカル ドメイン値キャッシュとして使用します (テーブルに既にデータが含まれている場合は、既存のコンテンツを読み取ることから始めます。スレッドセーフではありませんが、一度に 1 回だけ実行する場合に機能します)。

  3. ドメインを UNIQUE 列にし、ラッパー コードを記述してリターン エラーを処理する

  4. domain を UNIQUE または PRIMARY KEY 列にし、ON DUPLICATE KEY 句を使用します: INSERT INTO mydata ( domain, count ) VALUES ( 'firstdomain', 1 ), ( 'seconddomain', 1 ), ( ' thirddomain', 1 ) ON DUPLICATE KEY UPDATE カウント = count+1

  5. すべてのデータをテーブルに挿入してから、重複を削除します

挿入のバッチ処理 (つまり、ステートメントごとに複数の値句を使用) は、大幅に高速になる可能性があることに注意してください。

于 2008-11-10T03:24:38.233 に答える
0

あなたの質問を理解したかどうかはよくわかりませんが、おそらく SQL の"UNIQUE" 制約を探しているのでしょう。クエリが既存の値をフィールドに挿入しようとすると、この制約違反が PHP に通知されます。

于 2008-11-09T22:38:59.573 に答える
0

これにアプローチする方法はたくさんあります。その列に一意の制約 (主キーなど) を設定できます。これにより、そのドメインも挿入されている場合、挿入が失敗します。重複するドメインをすべて挿入して、後で削除することもできます。ドメインの多くが重複していない場合、これはうまく機能します。重複する行を見つけることについて、すでにいくつかの質問が投稿されています。

于 2008-11-09T22:40:02.303 に答える
0

これは、php ではなく sql で実行できます。

MySQl を使用していると仮定していますが、同じ原則が異なるデータベースでも機能します。

ドメイン列を主キーにします。(一意でなければならないので、理にかなっています。)

INSERT を使用する代わりに、UPDATE を使用します。

(テーブルに入れようとしている) 主キーが既に存在する場合、update は新しいタプルを作成するのではなく、既存のタプルを更新します。

したがって、既存のデータが異なる場合は上書きされ、同一の場合は更新がスキップされます。

于 2008-11-09T23:25:09.277 に答える