Вставка нескольких строк в один SQL-запрос?

У меня есть несколько наборов данных для одновременной вставки, скажем, 4 строки. В моей таблице три столбца: Person, Id и 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");

Могу ли я вставить все 4 строки в один оператор SQL?

Примечание модератора: Пожалуйста, передавайте все обсуждения достоинств этого вопроса этот мета-пост.
George Stocker 22.08.2013 17:39

Для Oracle sql см. stackoverflow.com/a/93724/1452172

ono2012 26.06.2014 15:20

Чтобы вставить несколько записей в одну строку, вы также можете попробовать это. Пример: вставить в tablename (col1, col2) select uid, uname from usertable;

Satendra Jindal 04.03.2015 15:35

вы также можете использовать этот запрос для вставки нескольких строк в один запрос SQL. вот запрос: INSERT в tablename1 (Person, Id, Office) SELECT 'John', 1, 'Lloyds Office' UNION SELECT 'Jane', 2, 'Lloyds Office' UNION SELECT 'Billy', 3, 'Lloyds Office' UNION SELECT «Miranda», 4, «Lloyds Office»

Laxmi 19.10.2016 09:02

Насколько я могу судить, в названии этой техники нет ничего конкретного, просто insert multiple rows, для тех, кто хочет иметь возможность относиться к этой технике концептуально. Ссылка: dev.mysql.com/doc/refman/5.5/en/insert.html

Kzqai 29.12.2016 01:45

@Kzqai, а как насчет insert set col1='val1', col2='val2 (?) col1='val3', col2=val2' в / для mysql? Я имею в виду вставку нескольких строк с использованием специфичного для mysql синтаксиса insert set; Является ли это возможным?

user4104817 10.09.2017 14:27

@ Chinggis6 Да, тривиально возможно, просто используйте select для значений столбца:

Kzqai 11.09.2017 20:24

@Kzqai, не могли бы вы привести пример?

user4104817 11.09.2017 21:18

@ Chinggis6 insert into profiles (name, description) select first, 'Auto-generated' from users Кажется, вы путаете инструкции вставки и обновления, которые являются разными зверями.

Kzqai 12.09.2017 00:21

@Kzqai Нет. Пожалуйста, проверьте ссылку, которую вы указали выше. MySQL, в отличие от других БД, позволяет использовать insert в стиле update с ключевым словом set, а не values. Это очень специфичный для MySQL нестандартный оператор SQL.

user4104817 12.09.2017 00:26

@ Chinggis6 А, понятно. Что ж, я просто рекомендую использовать стандартный синтаксис insert ... select, он даст вам все, что вам нужно, и настолько гибок, насколько вы можете пожелать. dev.mysql.com/doc/refman/5.5/en/insert.html

Kzqai 12.09.2017 16:43

ВСТАВИТЬ В MyTable ЗНАЧЕНИЯ («Джон», 123, «Lloyds Office»), («Jane», 124, «Lloyds Office»), («Billy», 125, «London Office»), («Miranda», 126, «Бристольский офис»);

David Marabottini 15.11.2018 17:51

@GeorgeStocker, интересно, что этот вопрос был закрыт как дубликат вопроса более низкого качества (с точки зрения просмотров и голосов), который задавали в течение года после этот вопрос. Разве не принято считать, что вопрос, который задают первым, остается открытым?

Doctor Jones 17.10.2019 16:28

Есть ли разница в производительности между этими двумя методами, если взять 5000 строк?

zulqadar idrishi 25.03.2021 10:41
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1 767
14
2 779 763
4

Ответы 4

Если вы вставляете в одну таблицу, вы можете написать свой запрос следующим образом (возможно, только в MySQL):

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

Начиная с SQL Server 2008, это будет работать, если вы замените двойные кавычки одинарными.

Valentino Vranken 22.03.2012 17:37

Также работает с postgres v9.0

suspectus 13.11.2013 14:19

И с SQLite

Michał Klimczak 09.12.2013 14:13

Только SQLite 3.7.11 и новее. Если вы не можете этого гарантировать, используйте метод UNION, показанный здесь: stackoverflow.com/a/5009740/841830

Darren Cook 13.02.2014 05:12

есть ли ограничения на значения? например, если у меня много записей, как поступить в такой ситуации?

Muneem Habib 28.09.2015 10:32

Не работает в хранилище данных MS SQL

Michael Freidgeim 25.10.2016 06:58

Он отлично работал в SQL Server 2012.

John Pittaway 22.02.2018 20:52

Muneem, ограничение составляет 1000 строк VALUE на оператор INSERT.

John Pittaway 22.02.2018 21:02

@too Он также хорошо работает на SQL SERVER 2014

PatsonLeaner 11.06.2018 15:04

А как насчет этого вопроса? stackoverflow.com/questions/51763204/… В основном такая же проблема, но имеет функцию обновления в случае дублирования записи

DayIsGreen 09.08.2018 12:56

ПРИМЕЧАНИЕ: Этот ответ предназначен для SQL Server 2005. Для SQL Server 2008 и более поздних версий существуют гораздо лучшие методы, как показано в других ответах.

Вы можете использовать INSERT с SELECT UNION ALL:

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

Однако только для небольших наборов данных, что должно подойти для ваших 4 записей.

Сработало с первого раза, спасибо! Я мог бы даже добавить дополнительные вещи, например: 'Before date: ' + date2str(GETDATE()) + ' after date.' Я знаю, что это немного странная команда date2str, но это особый синтаксис в моей базе данных.

Michael Larsson 19.08.2020 19:20

В SQL Server 2008 вы можете вставить несколько строк с помощью одного оператора SQL INSERT.

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

Для справки см. Курс MOC 2778A - Написание SQL-запросов в SQL Server 2008.

Например:

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

И обратите внимание, что максимальное количество строк в одном операторе вставки - 1000.

cryss 21.03.2013 17:39

Это должно быть сформулировано так: «максимальное количество строк в одном предложении VALUES - 1000». Это не оператор INSERT, который ограничен 1000 строками.

Anon 19.12.2013 21:58

@Anon Спасибо за разъяснение очень вводящего в заблуждение комментария ChrisJ. Спас меня от мучительной отладки. :)

async 11.03.2014 17:33

Я знаю, что этот вопрос и ответ старые, но я хотел бы упомянуть, что существует функциональная разница между использованием метода, упомянутого в вопросе, и в этом ответе. Первый запускает триггеры X раз с 1 записью во вставленной таблице. Второй запускает триггеры 1 раз с x количеством записей во вставленной таблице. Сделать второй метод лучшим выбором с точки зрения производительности при условии, что вы правильно настроили триггеры с пакетной вставкой.

Edwin Stoteler 24.04.2014 16:07

Это не работает с SQL Server 2005, см. stackoverflow.com/questions/2624713/…

pkr 28.04.2014 20:40

у вас нет точки с запятой в конце инструкции, в отличие от других ответов. тебе это нужно или нет?

ahnbizcad 07.12.2015 21:51

@ahnbizcad Точки с запятой в T-sql ОБЫЧНО необязательны, но, как сообщается, они потребуются в будущем. Вы должны привыкнуть использовать их для завершения каждого оператора - ваш код тоже будет выглядеть лучше, IMO.

NReilingh 09.12.2015 06:51

@NReilingh Я совершенно не знал об этом. Я действительно начал его искать. Для справки вот ссылка на Соглашения о синтаксисе t-sql в библиотеке Microsoft. Еще добавляю ссылку на интересная статья по теме. Спасибо !

salcoin 12.12.2015 20:54

Это также медленнее, чем то, что он делает сейчас: stackoverflow.com/questions/8635818/…

Zar Shardan 09.08.2016 02:24

@Anon Если вам нужно более 1000 строк, вы можете объединить несколько конструкторов VALUES с 1000 строками в CTE для вашей вставки. По-прежнему считается одним запросом!

NReilingh 09.03.2017 23:04

вы знаете, в какую спецификацию sql была введена? (несколько ЗНАЧЕНИЙ)

DanielV 27.07.2017 11:50

Максимальное количество строк - 1000, НО оптимальное количество - от 10 до 100 (в зависимости от количества столбцов). Прочитать эта статья

ABS 20.11.2017 20:40

Кто-нибудь может на это ответить? stackoverflow.com/questions/51763204/… В основном тот же вопрос, но с обновлением, если он существует

DayIsGreen 09.08.2018 12:52

Еще одно важное отличие: если вы попытаетесь вставить записи с разными типами значений, это не сработает с использованием только одной вставки. Когда используются несколько вставок, СУБД может преобразовывать их в целевой тип одну за другой. Но если первая запись содержит целое число, вторая - дату, а целевой тип - строка, автоматическое преобразование не применяется. Это отстой, когда таблица используется как хранилище общих параметров, а значение может быть любым.

klenium 25.03.2021 21:43

Операторы INSERT, использующие синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, каждый из которых заключен в круглые скобки и разделен запятыми.

Пример:

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

Лучший вопрос: зачем вам это нужно? Почему бы просто не запустить очиститель 4 команды в одном пакете. Если одна строка терпит неудачу, ваша партия терпит неудачу. если вы выполните их индивидуально, сгруппированные вместе, 3 из 4 будут успешными.

M T Head 07.09.2016 19:41

@ m-t-head У меня есть пример того, почему я хочу, и я назову вам 2 причины. Я вставляю в таблицу с триггером проверки целостности данных. Причина 1 - вставка значений по отдельности нарушит проверку целостности, что откатит транзакцию и вернет ошибку. Я использую SQL Server, который не поддерживает отложенные ограничения, поэтому даже если бы вместо триггера это было обычное ограничение, оно все равно не сработало бы. Причина 2 - проверка целостности - дорогостоящая процедура, и я бы предпочел, чтобы она выполнялась один раз, а не 1000 раз за транзакцию. Я все еще ищу решения.

tomosius 21.01.2017 09:36

вы можете создать один CTE и использовать вставку в YourTable (ID, Name) From select ID, Name From CTE

Mohammad Farahani 25.07.2017 08:15

А как насчет этого вопроса? stackoverflow.com/questions/51763204/… В основном такая же проблема, но имеет функцию обновления в случае дублирования записи

DayIsGreen 09.08.2018 12:56

@ m-t-e-head На самом деле, главная причина - производительность. Вставка тысяч или миллионов строк будет намного быстрее, если вы объедините их в пакеты разумного размера и используете один INSERT для каждого пакета.

uncoder 13.09.2018 21:46

Другие вопросы по теме