Почему серийный первичный ключ id постоянно меняется? - PullRequest
0 голосов
/ 27 марта 2020

Я только что начал курс веб-разработки для полного стека, который включает PostgreSQL. Мне задали несколько практических вопросов, и когда я нажал на run SQL, он отображает id, first_name и last_name, но когда я ввел больше строк кода, чтобы ответить на дополнительные вопросы, и снова щелкнул на run SQL, id номер изменился на совершенно другой номер, и я не понимаю, почему это происходит.

Screenshot Screenshot

В практических вопросах мне было поручено добавить больше строк, а затем обновить запись с идентификатором 2 на что-то другое, но как я могу обновить идентификатор 2 если идентификационные номера продолжают меняться? id 2 даже не было на экране. Что я понимаю в серийном первичном ключе id, так это в том, что он автоматически увеличивает идентификатор при добавлении новых строк, но в этом случае идентификатор постоянно меняется на случайные числа, почему он это делает? Скриншоты - это код из курса, а не то, что я ввел. http://sqlfiddle.com/#! 17 / a114f / 2 это ссылка, но я не уверен, что вы, кто не зарегистрировался на курсе, можете получить к ней доступ. Извините, если это действительно простой вопрос для новичка ie, но я потратил много времени на поиск в Интернете, и мне действительно нужно двигаться вперед.

Ответы [ 3 ]

3 голосов
/ 27 марта 2020

Насколько я могу судить, это ошибка в SQLFiddle.

Очевидно, что определение таблицы (или что-то еще) передается другим пользователям. Если вы делаете то же самое, например, используя db <> fiddle, вы всегда получаете один и тот же идентификатор после удаления и повторного создания таблиц:

db <> fiddle demo


SQLFiddle никогда не работал надежно для меня в любом случае. Плюс, кажется, застрял на действительно старой версии Postgres. Таким образом, вы можете использовать что-то другое, чтобы практиковать свои навыки SQL или делать домашнее задание.

0 голосов
/ 27 марта 2020

Как и a_horse_with_no_name, я тоже предпочитаю db <> fiddle для SQL совместного использования кода. Но если по каким-либо причинам вы ограничены sqlfiddle, вы можете добавить команду setval() в свой код, чтобы задать начальное значение.

select setval('drivers_id_seq',1);

INSERT INTO drivers (first_name, last_name) VALUES ('Amy', 'Hua');

SELECT * from drivers;

См. Пример здесь (ссылка) . Обратите внимание, что drivers_id_seq - это сгенерированное системой имя, которое вы можете легко угадать (если вам нужно повторно заполнить serial, созданный вами для другого объекта).

0 голосов
/ 27 марта 2020

In SQL Fiddle каждый раз, когда вы нажимаете кнопку справа, это собирается «перезапустить» ваш код.

Однако SQL Fiddle не гарантирует, что первичные ключи будут одинаковыми, и изолирует ваш код таким образом, что определенно вызывает увеличение pk.

http://sqlfiddle.com/#! 17 / a114f / 2 Вот оригинальная скрипка, и если вы просто нажмете на эту кнопку отправки, вы увидите, что значение меняется каждый раз.

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

...