2009-05-14 22 views
195

INSERT INTO table VALUES ..INSERT INTO table SETの主な違いは何ですか?MySQL INSERT INTOテーブルVALUE .. INSERT INTOテーブルSET

例:

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

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

そして、何この二つのパフォーマンスについて?

+9

Code CompleteとMcConnellの可読性を常に重視した後、INSERT INTO table SETは標準ではないことは残念です。はるかに明確に思える。私が移植した場合、問題から自分自身を救うために、INSERT INTOテーブル([列名、列名b])VALUES(['値a'、 '値b'])構文を使用する必要がありますPostgresに – cluelesscoder

+0

この質問はKanyeのビデオのようにウイルスになっています! – aMazing

答えて

156

私が知る限り、両方の構文は同等です。最初はSQL標準であり、2番目はMySQLの拡張です。

したがって、パフォーマンスは正確に同等です。

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

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

+3

'INSERT INTO table SET'を使って複数の値をどのようにINSERTしますか?これも可能ですか? – pixelfreak

+2

どういう意味ですか? OPの例では、SET a = 1、b = 2、c = 3であり、これは私の理解では複数の値です。 –

+6

私は、複数の行を挿入することを意味します。 INSERT INTOテーブル(a、b、c)VALUES(1,2,3)、(4,5,6)、(7,8,9); – pixelfreak

13

拡張機能は、挿入と更新で同様の構文を使用できるようにするためのものだと思います。オラクルでは、同様の構文トリックがある:

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

拡張機能では問題が解決するよりも多くの問題が生じます。 – Pacerier

+4

@Pacerierなど?私が見ている唯一の問題は、移植性の問題です(多くの場合、実際には関係ありません)。私は何かを欠いている? –

+1

@MarkAmery、うん、それを見ると、本当の利点はありません。欠点は、**不要な時間を無駄にすることです**、このスレッドの全体の存在は私のポイントを証明します。 – Pacerier

0

構文は(とにかく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つのクエリのテーブルに複数の行を挿入する場合や、各行のパフォーマンスが向上する可能性があります。本当にわからない。