1440

私は一度に挿入する複数のデータセットを持っています、例えば4行。

私のテーブルには3つの列があります。PersonIdそしてOffice

INSERT INTO MyTable VALUES ("John", 123, "Lloyds Office");
INSERT INTO MyTable VALUES ("Jane", 124, "Lloyds Office");
INSERT INTO MyTable VALUES ("Billy", 125, "London Office");
INSERT INTO MyTable VALUES ("Miranda", 126, "Bristol Office");

できますかinsert1行に4行すべてSQL statement


  • モデレータノート:この質問のメリットについてのすべての議論をしてくださいこのメタ投稿。 - George Stocker
  • Oracle SQLの場合stackoverflow.com/a/93724/1452172 - ono2012
  • @ Chinggis6はい、もちろん可能です。列の値にselectを使用するだけです。 - Kzqai
  • @ Chinggis6insert into profiles (name, description) select first, 'Auto-generated' from usersあなたは挿入と更新のステートメントを混同しているように見えます。 - Kzqai
  • @ Chinggis6ああ、わかりました。まあ、私は標準を使用することをお勧めしますinsert ... select構文、必要なものすべてが揃い、必要に応じて柔軟に対応できます。dev.mysql.com/doc/refman/5.5/en/insert.html - Kzqai

4 답변


1913

SQL Server 2008では、単一のSQL INSERTステートメントを使用して複数の行を挿入できます。

INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )

これを参照するには、MOCコース2778A - SQL Server 2008でのSQLクエリの作成を参照してください。

例えば:

INSERT INTO MyTable ( Column1, Column2, Column3 )
VALUES ('John', 123, 'Lloyds Office'), 
('Jane', 124, 'Lloyds Office'), 
('Billy', 125, 'London Office'),
('Miranda', 126, 'Bristol Office');


  • また、1つのinsertステートメントの最大行数は1000です。 - cryss
  • 「1行の最大行数」と表現する必要があります。VALUES句は1000 "です。そうではありませんINSERT1000行に制限されているステートメント。 - Anon
  • 私はこの質問と答えが古くなっているのを知っています、しかし私は質問とこの答えで言及された方法を使うことの間に機能的な違いがあることを言及するのが好きです。最初の実行では、挿入されたテーブルの1レコードでX回トリガーを実行します。 2回目は、挿入されたテーブル内のx個のレコードで1回トリガーを実行します。トリガーがバッチ挿入で正しく機能するようにしたと仮定して、2番目の方法をパフォーマンスの最良の選択にします。 - Edwin Stoteler
  • これはSQL Server 2005では機能しません。stackoverflow.com/questions/2624713/… - pkr298
  • T-sqlの@ahnbizcadセミコロンは通常はオプションですが、将来必要になると報告されています。各ステートメントを終了させるためにそれらを使用する習慣を身につけるべきです - あなたのコードはIMOよりもきれいに見えるでしょう。 - NReilingh

733

単一のテーブルに挿入する場合は、次のようにクエリを書くことができます(おそらくMySQLのみ)。

INSERT INTO table1 (First, Last)
VALUES
    ('Fred', 'Smith'),
    ('John', 'Smith'),
    ('Michael', 'Smith'),
    ('Robert', 'Smith');


  • SQL Server 2008では、二重引用符を一重引用符で置き換えると機能します。 - Valentino Vranken
  • postgres v9.0でも動作します - suspectus
  • そしてSQLiteと - Michał K
  • SQLite 3.7.11以降のみ。それが保証できない場合は、次に示すUNIONメソッドを使用してください。stackoverflow.com/a/5009740/841830 - Darren Cook
  • Muneem、制限はINSERTステートメントあたり1,000のVALUE行です。 - John Pittaway

120

注意:この回答はSQL Server 2005用です。SQLServer 2008以降では、他の回答に見られるように、もっと優れた方法があります。

あなたが使用することができますSELECT UNION ALLを指定したINSERT

INSERT INTO MyTable  (FirstCol, SecondCol)
    SELECT  'First' ,1
    UNION ALL
SELECT  'Second' ,2
    UNION ALL
SELECT  'Third' ,3
...

ただし、小さいデータセットに限ります。これは4つのレコードには問題ありません。


71

INSERT使用するステートメントVALUES構文は複数行を挿入できます。これを行うには、それぞれが括弧で囲まれ、コンマで区切られた複数の列値のリストを含めます。

例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);


  • もっと良い質問は、なぜあなたがしたいのですか? 4つのコマンドをまとめて1つのバッチにまとめて実行しないでください。 1行が失敗すると、バッチは失敗します。あなたがそれらを個々に一緒にするならば4つのうち3つは成功する。 - M T Head
  • @ m-t-head私はなぜ私がそうしたいのか、そしてあなたに2つの理由をあげる理由の例を示します。データの整合性チェックのトリガを持つテーブルに挿入しています。理由1 - 値を個別に挿入すると、整合性チェックに違反してトランザクションがロールバックされ、エラーが返されます。遅延制約をサポートしていないSQL Serverを使用しています。そのため、トリガーではなく通常の制約であっても機能しません。理由2 - 整合性チェックは費用のかかる手順であり、トランザクションごとに1000回ではなく1回実行する必要があります。まだ解決策を探しています。 - tomosius
  • 1つのCTEを作成し、YourTable(ID、Name)への挿入を使用できます。選択IDから、CTEからの名前 - Mohammad Farahani
  • この質問はどうですか?stackoverflow.com/questions/51763204/…基本的に同じ懸念が重複レコードの場合に更新する機能を持っています - DayIsGreen
  • @ m-t-e-head主な理由は、実際にはパフォーマンスです。数千または数百万の行を挿入すると、それらを適度なサイズのバッチにまとめ、バッチごとに単一のINSERTを使用すると、はるかに高速になります。 - uncoder

リンクされた質問


関連する質問

最近の質問