5

次の3つの列を含むMySQLテーブルがあるとします。 id、、aおよびbという名前の列idAUTO INCREMENTフィールドです。次のようなクエリをMySQLに渡すと、正常に機能します。

REPLACE INTO `table` (`id`, `a`, `b`) VALUES (1, 'A', 'B')

しかし、フィールドをスキップするidと、機能しなくなります。これは予想どおりです。

クエリignoreの一部のフィールドにアクセスする方法があるかどうかを知りたいです。REPLACEしたがって、上記のクエリは次のようになります。

REPLACE INTO `table` (`a`, `b`) VALUES ('A', 'B')

なぜそんなものが必要なのですか?

SELECT行が存在するかどうかを確認するために、クエリを使用してデータベースをチェックする必要がある場合があります。存在する場合UPDATEは既存の行に移動する必要があり、存在しない場合INSERTは新しい行に移動する必要があります。REPLACE単一のクエリで同様の結果(ただし同じではない)を達成できるかどうか疑問に思っています。

なぜ同じ結果になれないのですか?既存の行と新しい行がREPLACE失われるため、現在の行が失われ、自動インクリメントされた値が増加します。対照的に、クエリでは、フィールドは変更されません。DELETEINSERTprimary keyUPDATEprimary keyAI

MySQLREPLACE 。_

4

2 に答える 2

10
  • これは、置換を使用する方法ではありません。
  • primary key値がわかっている場合にのみ置換を使用してください。

マニュアル:

テーブルに PRIMARY KEY または UNIQUE インデックスがない限り、REPLACE ステートメントを使用しても意味がないことに注意してください。新しい行が別の行と重複しているかどうかを判断するために使用されるインデックスがないため、INSERT と同等になります。

于 2013-03-05T09:07:30.857 に答える
2

フィールドに一致する行が複数ある場合はどうなりますか?

照合して使用できるキーを追加することを検討してくださいINSERT IGNORE.. ON DUPLICATE KEY UPDATE。INSERT IGNORE の動作は、REPLACE とは少し異なります。

INSERT IGNORE は非常に高速ですが、目に見えない副作用が生じる可能性があります。

INSERT... ON DUPLICATE KEY UPDATE

これは副作用が少ないですが、特に MyISAM、重い書き込み負荷、または大量にインデックス化されたテーブルの場合、おそらくはるかに遅くなります。

副作用の詳細については、 https ://stackoverflow.com/a/548570/1301627 を参照してください。

INSERT IGNORE を使用すると、数列 (おそらく VARCHAR フィールドのみ) の非常に高速な MyISAM テーブルの検索に適しているようです。

例えば、

create table cities (
    city_id int not null auto_increment,
    city varchar(200) not null,
    primary key (city_id),
    unique key city (city))
    engine=myisam default charset=utf8;

insert ignore into cities (city) values ("Los Angeles");

この場合、「Los Angeles」を繰り返し再挿入しても、テーブルに実際の変更はまったく発生せず、新しい auto_increment ID が生成されなくなります。これにより、ID フィールドの枯渇 (使用可能な auto_increment 範囲をすべて使い果たす) を防ぐことができます。頻繁にかき混ぜられたテーブルで)。

さらに高速化するには、挿入する前に不気味なハッシュのような小さなハッシュを使用し、それを別の一意のキー列に使用すると、varchar はまったくインデックス付けされません。

于 2015-02-03T22:03:39.430 に答える