MySQL INSERT INTO таблиця VALUES .. vs INSERT INTO SET 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

А як щодо виконання цих двох?


12
Прочитавши Code Complete та постійний наголос МакКоннела на читанні, здається прикрою, що INSERT INTO table SETце не стандарт. Це здається набагато зрозумілішим. Напевно, мені доведеться все-таки використовувати INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])синтаксис, хоча щоб врятувати себе від неприємностей, якщо я перейду до Postgres.
Cluelesscoder

Відповіді:


195

Наскільки я можу сказати, обидва синтаксису рівноцінні. Перший - стандарт SQL, другий - розширення 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

2
Що ви маєте на увазі? На прикладі ОП написано SET a = 1, b = 2, c = 3, наскільки я розумію.
Вінко Врсалович

9
Я мав на увазі, ВСТАВИТИ кілька рядків. Як: ВСТАВЛЯЄТЬСЯ в таблицю (a, b, c) ЗНАЧЕННЯ (1,2,3), (4,5,6), (7,8,9);
pixelfreak

5
Тільки оператори INSERT, які використовують синтаксис VALUES, можуть вставляти кілька рядків.
Вінко Врсалович

8
@VinkoVrsalovic, неправда, select select також може вставити кілька рядків, коли вибрано кілька рядків
Pacerier

15

Я думаю, що розширення призначене для отримання подібного синтаксису для вставок та оновлень. У Oracle подібний синтаксичний трюк:

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

5
@Pacerier Такі як? Єдина проблема, яку я бачу, - це портативність (яка в багатьох контекстах насправді не має значення); я щось пропускаю?
Марк Амері

1
@MarkAmery, так, коли ви дивитесь на це, реальної користі немає. Недоліком є непотрібний витрачений час , все існування цієї теми доводить мою думку.
Pacerier

8
@Pacerier Я не впевнений, що я бачу вашу думку? Який час витрачено? Є користь, на яку вже вказувалося: для створення вашого оператора INSERT потрібно лише один раз перетворити масив пар ключів / значень, а не двічі, ніж вам потрібно використовувати синтаксис VALUES, що призводить до коротшого, чіткішого та швидше записувати код.
Марк Амері

@MarkAmery, але цей оракуловий трюк не має такої користі. Спочатку ви називаєте всі стовпці, а потім усі значення.
варення

12
@Pacerier Це справедливий момент, і тут слід зважувати компроміс. Проти цієї функції у вас є проблеми з портативністю та витрачено час на дослідження різниці між INSERT ... SET ...і INSERT ... VALUES .... Для цієї функції ви маєте коротший, швидший для запису код, підвищену читабельність та усунення помилок друку, викликаних змішуванням порядку вашого стовпця під час написання VALUESпропозиції. Моя кишка говорить мені, що в мережі добро переважає погане, але ваше судження може відрізнятися.
Марк Амері

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)було б кращим.

І якщо ви хочете вставити кілька записів в один запит, схоже, що INSERT INTO ... SETсинтаксис не спрацює, тоді як інший буде. Але в більшості практичних випадків ви перебираєте набір записів, щоб робити вставки все-таки, хоча можуть бути деякі випадки, коли, можливо, побудова одного великого запиту, щоб вставити купу рядків у таблицю за один запит, порівняно з запитом для кожен рядок може мати покращення ефективності. Дійсно не знаю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.