2014-02-01 3 views
0

Вот мой запрос:вставить несколько значений в одном запросе (заказать)

INSET INTO cities (name, country_id) 
VALUES ('New York', 11), ('London', 215), ('Moscow', 66) 

Правильно ли сказать, что строки будут вставлены excactly в порядке запроса? Итак, New Yor будет вставлен первым, чем Лондон, чем Москва. Возможно ли, что Лондон будет вставлен первым? Я не могу найти эту информацию в документации postgresql.

редактировать:

Итак, мне нужно знать, это безопасно, чтобы думать, что первый идентификатор будет в Нью-Йорке, второй в Лондоне, третий по Москве.

edit2:

Мне просто нужно, чтобы связать город с возвращаемым идентификатором. Полный запрос:

INSET INTO cities (name, country_id) 
    VALUES ('New York', 11), ('London', 215), ('Moscow', 66) 
    RETURNING id 

Таким образом, это не представляется возможным для множественного ввода?

Edit3:

Мой вопрос дублирует это один: Is INSERT RETURNING guaranteed to return things in the "right" order? Так что, я думаю, чтобы убедиться, что мне нужно, чтобы сделать каждую вставку в его собственном запросе. Спасибо.

+0

Почему это для вас важно? – zerkms

+0

Я использую «RETURNING id» в конце запроса. Поэтому мне нужно знать, насколько безопасно думать, что первый id будет для Нью-Йорка, второй для Лондона, третий для Москвы. – user1561346

+2

Я не думаю, что вы можете полагаться на идентификаторы, возвращаемые в том же порядке, но я не могу найти ссылку в руководстве для этого. –

ответ

1

Можно вернуть несколько значений, чтобы вы могли их сопоставить таким образом, например:

INSET INTO cities (name, country_id) 
    VALUES ('New York', 11), ('London', 215), ('Moscow', 66) 
    RETURNING id, name, country_id 

просто выберите столбцы, которые вы хотите вернуть.

+0

Что делать, если имена и country_ids могут быть идентичными? Города - это всего лишь пример. – user1561346

+0

Вам нужно будет рассказать подробнее о своем вопросе, я думаю, что ответил на то, что вы спрашиваете? .. на первый взгляд, я бы сказал, что у вас проблемы с дизайном, но я ничего не знаю о том, что вы делаете. Возможно, вы можете использовать временную метку для вставки, а затем упорядочить ее в своих вариантах. –

+0

Сделано третье редактирование. – user1561346

1

данные не хранятся в указанном порядке.

0

Если предложение ORDER BY не указано, инструкция SELECT не обязательно возвращает записи в том же порядке, что и вставляемые.

Возможно, вам необходимо добавить объявление auto increment identity в свою таблицу и затем упорядочить результаты по этому полю.

+1

Я думаю, вы, возможно, неправильно поняли вопрос; пользователь спрашивает, вернет ли вставка ... return список идентификаторов в том же порядке, что и входные значения, появившиеся в предложении 'VALUES'. –

+0

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

+0

@CraigRinger, правда. Я думаю, это из-за моего бедного английского. – user1561346

0

Если вы слишком озабочены порядком введенных данных, добавить столбец в таблицу, чтобы работать в качестве последовательности, указать его во время isnert

Пример:

INSET INTO cities (
    seq, 
    name, 
    country_id 
) 
VALUES (seq + 1, 'New York', 11) 

INSET INTO cities (
    seq, 
    name, 
    country_id 
) 
VALUES (seq + 2, 'London', 215)... etc 

конечно проинициализировать ваша последовательность, получив предыдущее значение seq из уже вставленных данных

+0

Э-э, что? Если вы собираетесь это сделать, наверняка вы используете столбец «SERIAL» или системную последовательность? Все дело в том, что они пытаются сопоставить входные значения в 'insert' с возвращаемыми идентификаторами в предложении' return'. Вы не используете многозначные вставки, поэтому проблема спорная. –

Смежные вопросы