MySQL INSERT INTO table VALUES .. vs INSERT INTO table SET


252

主な違いは何であるINSERT INTO table VALUES ..とは INSERT INTO table SET

例:

INSERT INTO table (a, b, c) VALUES (1,2,3)

INSERT INTO table SET a=1, b=2, c=3

そして、これら2つのパフォーマンスはどうですか?


12
Code CompleteとMcConnellが常に読みやすさを重視していることを読んだ後、残念ながらそれINSERT INTO table SETは標準ではないようです。はるかにはっきりしているようです。INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])とにかく、Postgresに移植する場合、問題を回避するために構文を使用する必要があると思います。
cluelesscoder、2012

回答:


195

私の知る限り、両方の構文は同等です。1つ目はSQL標準、2つ目はMySQLの拡張機能です。

したがって、それらは賢明なパフォーマンスとまったく同じになるはずです。

http://dev.mysql.com/doc/refman/5.6/en/insert.html言う:

INSERTは、既存のテーブルに新しい行を挿入します。ステートメントのINSERT ... VALUESおよびINSERT ... SET形式は、明示的に指定された値に基づいて行を挿入します。INSERT ... SELECTフォームは、別のテーブルから選択された行を挿入します。


4
どのようにして複数の値を挿入しますINSERT INTO table SETか?これは可能ですか?
pixelfreak 2012年

2
どういう意味ですか?OPの例では、SET a = 1、b = 2、c = 3と言っていますが、これは私の理解では複数の値です。
Vinko Vrsalovic 2012年

9
つまり、複数の行を挿入します。例:INSERT INTO table(a、b、c)VALUES(1,2,3)、(4,5,6)、(7,8,9);
pixelfreak

5
VALUES構文を使用するINSERTステートメントのみが複数の行を挿入できます。
Vinko Vrsalovic

8
@ VinkoVrsalovic、trueではなく、複数の行が選択されている場合、selectを挿入して複数の行を挿入することもできます
Pacerier

15

拡張機能は、挿入と更新のために同様の構文を許可することを目的としていると思います。Oracleでは、同様の構文トリックは次のとおりです。

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)

5
@Pacerierなど?私が目にする唯一の問題は、移植性の問題です(多くの場合、これは重要ではありません)。私は何かを逃していますか?
Mark Amery 2013年

1
@MarkAmery、うん、それを見ると、本当のメリットはありません。不利な点は不必要な時間の浪費です。このスレッドの存在全体が私のポイントを証明しています。
パチェリエ2013年

8
@Pacerier私はあなたの主張を理解しているかわかりませんか?何時間無駄?すでに指摘されている利点があります:VALUES構文を使用する必要があるので2回ではなく、キーと値のペアの配列を1回ループするだけで、INSERTステートメントを作成できます。これにより、短くて明確になります。 、およびより高速に記述できるコード。
Mark Amery 2013年

@MarkAmeryが、このOracleトリックはありません持っていることの利点を。最初にすべての列に名前を付け、次にすべての値に名前を付けます。
ホブ、2013

12
@Pacerierそれは公平な点であり、考慮すべきトレードオフがあります。機能に対して、あなたは違い研究無駄な移植性の問題や時間持つINSERT ... SET ...としますINSERT ... VALUES ...。この機能では、コードが短く、書き込みが高速で、読みやすさが向上し、VALUES句を記述するときに列の順序を混同することによるタイプミスがなくなります。私の直感は、ネットでは善が悪を上回っていると私に言っていますが、あなたの判断は異なる場合があります。
Mark Amery 2014年

4

構文は同等です(とにかくMySQLのINSERT INTO table SET x=1, y=2場合)。特に多くの列を挿入する場合は、変更が簡単で、ステートメントのエラーを簡単にキャッチできるため、構文を使用します。10または15以上の列を挿入する必要がある場合(x, y) VALUES (1,2)、私の意見では、構文を使用して何かを混ぜ合わせるのは本当に簡単です。

異なるSQL標準間の移植性が問題である場合は、おそらくINSERT INTO table (x, y) VALUES (1,2)推奨されます。

また、1つのクエリに複数のレコードを挿入する場合、INSERT INTO ... SET構文は機能しませんが、もう1つのクエリは機能します。しかし、ほとんどの実際的なケースでは、レコードのセットをループして挿入を行いますが、1つの大きなクエリを作成して、1つのクエリのテーブルに一連の行を挿入する場合と、行ごとに、パフォーマンスが向上する可能性があります。本当にわからない。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.