データは、MySQLを追加するために存在している場合DUPLICATE KEY UPDATEで更新され、INTO REPLACE

#下面建立ゲーム表、设置名值为唯一索引。
CREATE TABLEの`game`(
  ` id`はint(11)NOT NULL AUTO_INCREMENT、
  `name`のVARCHAR(20)文字セット、NOT NULLをUTF8 
  (4)` type_id` TINYINT NOT NULL DEFAULT '0'、
  'attr`のVARCHAR(20)NOT NULL、
  `type_extends`のVARCHAR(20)NOT NULL、
  PRIMARY KEY(` id`)、
  BTREEを用いUNIQUE KEY `NAME`(` NAME`)
)ENGINE = InnoDBのDEFAULT CHARSET = utf8mb4

 

ONの場合KEY UPDATE文を複製:

MySQLのマニュアル:あなたはDUPLICATE KEY UPDATE ON指定し、挿入行の後にUNIQUEインデックスまたはPRIMARY KEYに重複した値になることができた場合は、古い行のUPDATEを実行します。

ここでの意味は、プレゼンスの更新を追加するために存在しないレコードを設定するには、このレコードを追加するには、ユニークで主キーのインデックストリガするために、同時に発生しなければなりませんと言われています。

私たちは、一意のインデックス値を挿入しようと#はそのことを示唆し、既に存在する名前を記録:[のErr] 1062 -重複エントリ 「 キー「名前」のためのゲーム4」
`type_id` =、試合SET` NAME` =「ゲーム4」を挿入します5「」、 `attr` =「無類のゲーム」、` type_extends` =」。5' 
一意の主キーのインデックスがある場合、ここで#は、重複するキーUpdateであると更新操作の実行、その後、記録時間にレコードを複製する
に挿入しますゲームセット`NAME` = '試合4'、` type_id` = '5 '、 'attr` = ' 無類のゲーム'、 `type_extends` = '5' 
ON KEY = 'UPDATE type_id` DUPLICATE' 5' 、 'attr` =無敵ゲーム' `type_extends` =' 5 '

 更新するがある場合、更新が見つからない場合DUPLICATE KEY UPDATE句で使用するためにレコードが存在しない場合は、行の数を加えることの影響が行、次いで実行され、その後、行数の変化の影響は0であるか、または行数が2行である影響を及ぼす。

以下のためのINTOステートメントREPLACE

MSQLマニュアル:REPLACEとINSERT操作は非常に似ています。新しいレコードが挿入される前に、古いレコードと、テーブルの新しいレコードまたはPRIMARY KEY UNIQUEインデックスは、同じ値を持っている場合にのみ、唯一の例外は、古いレコードが削除されます。

表はPRIMARY KEYまたはUNIQUEインデックスを持っていない限り、それ以外の場合は、REPLACEステートメントを使用意味をなさないことに注意してください。同じとINSERTステートメント、インデックスが使用されないため、新しい行が他の行を複製するかどうかを決定します。

これは、削除されたレコードで見つかったあなたの最初のレコードは新しいレコードを挿入した場合、用INTOステートメントREPLACEことを意味します。

表元のレコードは、次のとおりです。

 

#ステートメントを実行します。
INTOゲームSET `NAME` = 'ゲーム4'、ATTR = '最強のゲーム2'、type_extendsの= '最強のゲーム2_4'をREPLACE

 

ここでIDは自動的に、二つの特別な場所があるが、主キーを増加させるために設けられている、IDが自動成長が大きくなっており、0〜2となるTYPE_IDあります

MySQLのマニュアルでは:すべての列の値が指定したREPLACE文で値から取得されます。欠落している列は、デフォルト値に設定されており、これは、同じINSERT。あなたは、新しい行の値を使用することはできません、現在の行から値を参照することはできません。あなたは、「SET COL_NAME = COL_NAME + 1」の割り当てを使用した場合、右側の列の名前を参照するには、DEFAULT(COL_NAME)プロセスのようになります。したがって、割り当ては、SET COL_NAME = DEFAULT(COL_NAME)+ 1に相当します。

これは、REPLACE文の設定には列がデフォルト値に設定されますが存在しないことを意味し、デフォルト値は0 TYPE_ID文を交換した後、挿入、削除することであるため、0に設定され、そしてここでもよく理解されているので、ここでここにあります値がデフォルト値となるよう設定されていない場合、新しいデータが挿入されています。したがって、次のステートメントで得られた結果は、期待される結果ではありません。

TYPE_IDのデフォルト値は0であるため、本明細書の結果が得られた#文1をTYPE_ID。ここでTYPE_ID = TYPE_ID + 1対応TYPE_ID = DEFAULT(TYPE_ID)+1

ゲームセットにREPLACE `NAME` = '試合4'、TYPE_ID = TYPE_ID + 1、ATTR = '最強ゲーム2'、type_extends = '最強ゲーム2_4'

レコードが存在しない場合に実行される文のINTO REPLACEについての追加は、行の数が行である影響を与え削除または線の数が2であるのインパクトを追加します。

現在のレコードが変更されたために、DUPLICATE KEY UPDATE ON異なる方法で処理し、存在しないレコードを追加するINTOステートメントREPLACE:

DUPLICATE KEY UPDATE文ON:それが変更されたため、レコードは、その後、設定されていないUPDATEレコード句句UPDATE更新フィールドの現状を維持するように設定のみフィールドの内容を更新存在する場合、判定記録によると、主キーまたは一意索引は、存在する場合声明は、それが自動成長フィールドに変更を加えないようにします。

文の戻り値は以下のとおりです。

0:、同じ一意の主キー索引またはレコードを有することが判明更新ステートメントを実行しますが、コンテンツと実行結果と一致し、フィールドの内容の文が変更されない既存のフィールドを更新します。

1:直接挿入ステートメントを実行し、同じ主キーまたは一意索引のレコードは認められませんでした。

2:同じ一意の主キーのインデックスまたはレコードを有することが判明し、更新ステートメントを実行し、フィールドの内容とフィールドの内容前一貫した文の実行結果の変更を更新します。

INTOステートメントREPLACE:レコードの存在は、レコードが、レコードを削除してから、現在の文のINSERTフィールドの内容を実行して存在しているかどうかを判断するために主キーまたは一意のインデックスに基づいています。それはINSERT後に削除されているので、その自動成長分野の変更を行います。

文の戻り値は以下のとおりです。

1:直接挿入ステートメントを実行し、同じ主キーまたは一意索引のレコードは認められませんでした。

2:フィールドは、それがINSERTの実装にデフォルト設定されます設定されていないINTOステートメントREPLACEで満たされている場合、同じ一意のインデックスまたは主キーのレコードを見つけるには、その値を注意することは、ここで、指定された文のINSERT文を削除します。

MySQLのマニュアルでON DUPLICATE KEY UPDATEステートメントの場合、この文があります。

1つのINSERTで... DUPLICATE KEY UPDATE ...書類上では、INSERT文から列の値の部分にアクセスするために使用されるUPDATE句内のVALUES(COL_NAME)関数を使用することができます。つまり、UPDATE句内の値は、(COL_NAME)アクセスが必要COL_NAME値が挿入され、重複キー違反が発生しません。

テーブルの元データ:

 

ゲームセット。INSERT INTO `NAME` = '試合4'、` type_id` = '4 '、 'attr` = ' 無類のゲーム'、 `type_extends` = '無類のゲーム_4' 
DUPLICATE = CONCAT type_extends` ON KEY UPDATE(` VALUES(ATTR)、 '_' 、VALUES(TYPE_ID))

 結果:

おすすめ

転載: www.cnblogs.com/alonely/p/10945518.html