MySQL Replace INTOの高度な使用

1847 ワード

REPLACEの動作はINSERTに似ています.ただし、表の古いレコードがPRIMARY KEYまたはUNIQUEインデックス用の新しいレコードと同じ値である場合は、新しいレコードが挿入される前に古いレコードが削除されます.13.2を参照.4節、「INSERT文法」.表にPRIMARY KEYまたはUNIQUEインデックスがない限り、REPLACE文を使用することは意味がありません.この文はINSERTと同じです.インデックスがないため、新しいローが他のローをコピーしたかどうかを決定します.すべてのカラムの値は、REPLACE文で指定された値から取得されます.欠落したすべてのカラムはINSERTと同じデフォルト値に設定されます.現在の行から値を参照したり、新しい行で値を使用したりすることはできません.たとえば、「SET col_name=col_name+1」の値を指定すると、右側にあるカラム名の参照がDEFAULT(col_name)として処理されます.したがって、この付与値はSET col_に相当するname = DEFAULT(col_name) + 1.REPLACE intoを使用するには、テーブルのINSERTとDELETEの両方の権限が必要です.REPLACE文は、影響を受けるローの数を示す数を返します.この数は、削除され挿入された行数の和です.1つのローに対してREPLACEの数が1の場合、ローは削除されずに挿入されます.この数が1より大きい場合、新しいローが挿入される前に、1つ以上の古いローが削除されます.テーブルに複数の一意のインデックスが含まれており、新しいローが異なる一意のインデックス内の異なる古いローの値をコピーしている場合は、1つのローが複数の古いローを置き換えている可能性があります.影響を受ける行数は、REPLACEが1行しか追加されていないか、またはREPLACEが他の行も置換されているかを容易に決定することができる:その数が1(追加)以上であるかどうかを確認する(置換).C APIを使用している場合はmysql_を使用できます.affected_rows()関数は、影響を受けるロー数を取得します.現在、サブクエリで同じテーブルから選択しながら、1つのテーブルに交換することはできません.以下は使用アルゴリズムのより詳細な説明である(このアルゴリズムはLOAD DATA...REPLACEにも用いられる):1.新しい行をテーブルに挿入してみます.プライマリ・キーまたは一意のキーに対して重複キーエラーが発生したために挿入に失敗した場合:a.重複キー値を含む競合行をテーブルから削除b.新しい行をテーブルに再度挿入しようとする
 
 
例:
CREATE TABLE  `test`.`n` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `time` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM

 
replace into n (id,time) values(1,now());

 
SELECT * FROM n ;
 
テストによりprimary-keyがある場合、replace intoを使用してid incrementが持続的に増加することはありません.
1, '2011-09-23 12:52:50'
2, '2011-09-23 12:46:34'
10, '2011-09-23 12:46:46'

 
まとめ:replace intoを使用する場合は、プライマリ・キーが持続的に増加しないように、プライマリ・キーを含む場合の操作を考慮する必要があります.