ホームページ  >  記事  >  バックエンド開発  >  重複しないレコードを配置する ~mysqlステートメントを探しています~

重複しないレコードを配置する ~mysqlステートメントを探しています~

WBOY
WBOYオリジナル
2016-06-13 13:23:33858ブラウズ

固有のレコードを挿入します~~~mysql ステートメントを探しています~~~
テーブル構造は非常に単純です:

SQL コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->--------------------------------
id  |  cat  |  article
--------------------------------
 1       abc           1
 2       aaa           2
 3       ccc           1
--------------------------------

ここで、id は唯一の主キー、AUTO_INCREMENT 、レコードを挿入する場合は役に立ちません。

次に、いくつかのレコードを挿入する必要があります。挿入は、新しいレコードの cat とarticle_id が元のデータに存在しない場合にのみ許可されます。たとえば、cat='ddd',article=1 および cat='aaa',article=1 のレコードは挿入できますが、cat="abc",article=1 および cat="ccc",article のレコードは挿入できます。 =1 は許可されません。そのようなレコードが既に存在するため、挿入は許可されます。

mysql ステートメントの書き方は?

オンラインで見つけた投稿は理解できませんが、それらはすべて主キーの非重複に依存しているようです。

-----解決策--------------------------------
cat とarticle を結合 一意のインデックスを挿入する場合は replace コマンドを使用します


------解決策----------------------
マニュアルも読まないんですか?このように進歩するにはどうすればよいでしょうか?

CREATE [UNIQUE|FULLTEXT] INDEXindex_name
ON tbl_name (col_name[(length)],... )


REPLACE [LOW_PRIORITY | DELAYED]
[ INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...
または REPLACE [LOW_PRIORITY DELAYED]
[INTO] tbl_name [(co​​l_name,...)]
SELECT ...
または REPLACE [LOW_PRIORITY DELAYED]
[INTO] tbl_name
SETcol_name=expression,col_name=expression,...

REPLACE は INSERT とまったく同じように機能します。ただし、テーブルに古いレコードがあり、新しいレコードの UNIQUE キーまたは PRIMARY KEY の値が同じである場合、新しいレコードが作成される前に古いレコードが削除されます。挿入されました。セクション 6.4.3 INSERT 構文を参照してください。

言い換えると、REPLACE から古い行の値にアクセスすることはできません。 MySQL の一部の古いバージョンではこれを実行できる場合がありますが、これはバグであり、現在は修正されています。

REPLACE を使用できるようにするには、テーブルに対する INSERT 権限と DELETE 権限が必要です。

REPLACE を使用する場合、新しい行が古い行を置き換える場合、mysql_affected_rows() は 2 を返します。これは、新しい行が挿入される前に重複した行が削除されるためです。

この事実により、REPLACE がレコードを追加しているのか、レコードを置換しているのかを簡単に判断できます。影響を受ける行の値が 1 (追加) か 2 (置換) かを確認してください。

UNIQUE インデックスまたは PRIMARY KEY を使用しない限り、REPLACE コマンドの使用は INSERT のみを実行するため無意味であることに注意してください。

------解決策----------------------
次に、これを実行します。 .. に無視を挿入します。 ......
しかし、cat と Article の結合固有インデックスも作成する必要があります。
------解決策----------------------
最も愚かな方法は、値を挿入する前に選択することです。すでに存在します。
------解決策----------------------
select を使用して確認するだけです
------解決策---------
repalce into tablename(id,name)values( ' .$id.','".$name."'); または tablename(id,name) select id,name に置き換えます
------解決策---------
元の投稿者のアイデアに従って、最初に選択してから、差し替えた方が良いです。
------解決策------------------
比較的簡単な replace を使用することをお勧めしますそして効率的です。
------解決策---------
選択 時間の無駄ですし、解決しませんテーブルをロックするのはまったくアトミックではないとバイ氏は判断した。

一意のインデックスを直接挿入して結果を確認します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。