mysql insert構文注意事項(ON DUPLICATE KEY UPDATE)


mysql insert構文注意事項(ON DUPLICATE KEY UPDATE)
INSERT構文
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]       [INTO] tbl_name [(col_name,...)]       VALUES ({expr | DEFAULT},...),(...),...       [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]または:INSERT[LOW_PRIORITY|DELAYED|HIGH_PRIORITY][IGNORE][INTO]tbl_name       SET col_name={expr | DEFAULT}, ...       [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]または:INSERT[LOW_PRIORITY|HIGH_PRIORITY][IGNORE][INTO]tbl_name [(col_name,...)]       SELECT ...       [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
DELAYED 
        
DELAYED      INSERT REPLACEDELAYED

, , 。
delayed-row) 。 ,
, , 。 , 。 , 。

· INSERT DELAYED
INSERTINSERT DELAYED...SELECT DELAYED
·
INSERT DELAYED...ON DUPLICATE UPDATE DELAYED
·
, , LAST_INSERT_ID() AUTO_INCREMENTAUTO_INCREMENT
·
SELECTDELAYED , 。
· DELAYED
DELAYED
  ,                 ,            。    ,        mysqld(  ,  kill -9
mysqld , 。
IGNORE
IGNORE MySQL     SQL   。            ,
STRICTIGNORE ALTER TABLE
IGNORE, , , 。
IGNORE, , , 。
, , 。
insert ignore into tb(...) value(...)
           ,    ,    

ON DUPLICATE KEY UPDATE

ON DUPLICATE KEY UPDATEを指定し、行を挿入するとUNIQEインデックスまたはPRIMARY KEYに重複する値が表示される場合は、古い行UPDATEを実行します.たとえば、カラムaがUNIQUEとして定義され、値1が含まれている場合、次の2つの文は同じ効果を有します.
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=c+1;
mysql> UPDATE table SET c=c+1 WHERE a=1;

行が新しいレコードとして挿入されると、影響を受ける行の値は1になります.既存のレコードが更新されると、影響を受けるローの値は2になります.
注記:列bが一意の列である場合、INSERTはこのUPDATE文に相当します.
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

a=1 OR b=2が複数の行方向に一致する場合、更新されるのは1つの行のみである.通常、一意のキーワードが複数あるテーブルに対してON DUPLICATE KEY句を使用しないようにしてください.
UPDATE句でVALES(col_name)関数を使用してINSERTから...UPDATE文のINSERT部分はカラム値を参照します.すなわち、重複キーワード競合が発生しない場合、UPDATE句のVALES(col_name)は、挿入されたcol_を参照することができるnameの値.この関数は、複数行の挿入に特に適しています.VALES()関数はINSERTのみ...UPDATE文に意味があり、他の場合はNULLを返します.
例:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

この文は、次の2つの文と同じ役割を果たします.
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9;

ON DUPLICATE KEY UPDATEを使用する場合、DELAYEDオプションは無視されます.
まとめ:
1. DELAYED
迅速な挿入としては,失効性にあまり関心がなく,挿入性能を向上させる.
2.Ignoreは、プライマリ・キー対応レコードのみが存在しないことに注目し、ない場合は追加し、ある場合は無視する.
3.ON DUPLICATE KEY UPDATE追加時に操作し、非プライマリキー列に注目し、ignoreとの違いに注意し、ある場合は指定列を更新し、ない場合は追加する.