2008-10-24 11 views
72

Я работал с T-SQL в MS SQL в течение некоторого времени, и как-то, когда я должен вставить данные в таблицу я предпочитаю использовать синтаксис:ВСТАВИТЬ против INSERT INTO

INSERT INTO myTable <something here> 

Я понимаю, что ключевое слово INTO необязательно здесь, и мне не нужно его использовать, но как-то он стал привычкой в ​​моем случае.

Мой вопрос:

  • Существуют ли какие-либо последствия использования INSERT синтаксис против INSERT INTO?
  • Какой из них полностью соответствует стандарту?
  • Являются ли они действительными в других реализациях стандарта SQL?

ответ

72

INSERT INTO является стандартом. Несмотря на то, что INTO является необязательным в большинстве реализаций, это требуется в нескольких, поэтому рекомендуется включить его, чтобы убедиться, что ваш код переносимый.

Вы можете найти ссылки на несколько версий стандарта SQL here. Я нашел HTML-версию более старого стандарта here.

+1

В книге «SQL-99 Complete, Really» говорится, что Sybase (и, следовательно, MS SQL Server) ведет себя нестандартным способом, позволяя INTO быть необязательным. Другие бренды базы данных требуют ключевое слово. – 2008-10-24 16:38:40

+2

Справа. Если вы всегда используете INTO, вам не нужно помнить, какие из них считаются необязательными. Все реализации позволяют использовать его. – 2008-10-24 19:12:49

1

Оба они делают то же самое. INTO является необязательным (в SQL-сервере T-SQL), но удобство чтения.

10

Он может быть необязательным в mySQL, но он является обязательным в некоторых других СУБД, например Oracle. Таким образом, SQL будет более потенциально переносимым с ключевым словом INTO, для чего он стоит.

18

Это то же самое, INTO полностью необязательно в T-SQL (другие диалекты SQL могут отличаться).

Вопреки другим ответам, я думаю, что это ухудшает читаемость INTO.

Я думаю, что это концептуальная вещь: В моем восприятии, я не вставляя строку в таблицу с именем «Клиент», но я вставив клиента. (Это связано с тем, что я использую для обозначения моих таблиц в единственном числе, а не во множественном числе).

Если вы следуете первому понятию, INSERT INTO Customer, скорее всего, «подойдет вам».

Если вы следуете второй концепции, это, скорее всего, будет INSERT Customer для вас.

+5

Я думаю, что риск с вашим подходом заключается в том, что вы можете заставить новых программистов путать объекты со столами. – 2008-10-24 15:25:59

0

Я предпочитаю использовать его. Он поддерживает те же синтаксические разграничения и читаемость, что и другие части языка SQL, например group BY, order BY.

4

Один урок Я склонился над этой проблемой, так что вы всегда должны держать ее в соответствии! Если вы используете INSERT INTO, не используйте INSERT. Если вы этого не сделаете, некоторые программисты могут снова задать тот же вопрос.

Вот мой другой пример, связанный с примером: у меня была возможность обновить очень длинную хранимую процедуру в MS SQL 2005. Проблема в том, что слишком много данных было вставлено в таблицу результатов. Мне нужно было выяснить, откуда пришли данные. Я попытался выяснить, где были добавлены новые записи. В начале раздела SP я увидел несколько INSERT INTO.Затем я попытался найти «INSERT INTO» и обновил их, но я пропустил одно место, где использовался только «INSERT». На самом деле это вставляло 4k + строки пустых данных в некоторые столбцы! Конечно, я должен просто искать INSERT. Однако это случилось со мной. Я обвиняю предыдущего программиста IDIOT :) :)

0

Если доступно, используйте стандартную функцию. Не то, чтобы вам когда-либо понадобилась переносимость для вашей конкретной базы данных, но, скорее всего, вам нужна переносимость для ваших знаний SQL. Особый неприятный пример T-SQL - использование isnull, использование coalesce!

3

В SQL Server 2005, вы могли бы иметь что-то между вставкой и INTO так:

 
INSERT top(5) INTO tTable1 SELECT * FROM tTable2; 

Хотя она работает без INTO, я предпочитаю использовать INTO для удобства чтения.

0

Я начал использовать SQL на ORACLE, поэтому, когда я вижу код без INTO, он просто выглядит «сломанным» и запутанным.

Да, это только мое мнение, и я не говорю вам, что должен всегда использовать INTO. Но вы не знаете, что многие другие люди, вероятно, подумают о том же, особенно если они не начали писать сценарии с новыми реализациями.

С SQL Я думаю, что также очень важно понять, что вы добавляете ROW в TABLE и не работаете с объектами. Я думаю, что новому разработчику было бы бесполезно думать о строках/записях SQL-таблиц как о объектах. Опять же, только мне мнение.