172 похожих чатов

Ребят, нужна помощь с пониманием типов первичных ключей Правильно ли

я понимаю, что есть вот такие 2 типа?
1. Следующим ключом делает +1 от максимального ключа
2. Следующим ключом делает +1 от последнего сгенерированного ключа?

То есть во втором случае если последним был 14, а я ручками прописала ключ для след.записи 20, то есть генерация не будет работать, соответственно следующая генерация выдаст 15, 16, 17, 18, 19, потом на 20 выдаст duplicate key value ошибку?

18 ответов

12 просмотров

да, поэтому PK делают по сиквенсу, чтобы не возникали такие коллизии

Zamira-Norova Автор вопроса
V
да, поэтому PK делают по сиквенсу, чтобы не возник...

Если PK 2 типа, то как-то его можно поменять на тип 1 при существующей таблице не навредив ничему? Можно ли в целом сделать так, что бы все новые PK были второго типа?

Вы путаете первичный ключ - суть уникальный индекс и sequence - некий нетранзакционный генератор последовательных чисел, который часто используют как генератор уникальных значений для первичного ключа

Первичный ключ не генерирует значения, он только ограничивает содержимое. Вы можете вставлять в колонки ПК любые допустимые значения (не NULL, уникальные). Если что-то “не так” — получите ошибку. SEQUENCE — способ получить автоматическую генерацию целочисленнх ПК.

Нет давно таких типов уже, только последовательность

Нет, никаких "разных типов первичного ключа" в этом смысле несуществует. Первичный ключ -- он всегда просто уникальный ключ на не-null поле, и к генерацыи значений это совершэнно ортогонально.

Zamira-Norova Автор вопроса
Ilya Anfimov
Нет, никаких "разных типов первичного ключа" в это...

Это я понимаю. Я про способы генерации этих первичных ключей

Zamira Norova
Если PK 2 типа, то как-то его можно поменять на ти...

да, сделать default value sequence.nextval и навсегда забыть о проблеме генерации новых айдишек (только обязательно не cycle, иначе можно дойти до предела и прыгнуть снова в 1)

Zamira Norova
Это я понимаю. Я про способы генерации этих первич...

Хотя кто-то, безусловно, генерирует новый ключ как +1 от максимального -- это крайне непрофессиональная реализацыя. (А два основных способа генерирования синтэтического первичного ключа -- это последовательность, которая генерирует +1 от последнего сгенерированного, и рандом, последнее чаще всего на uuid чтобы не особо париться с коллизиями).

Zamira Norova
Это я понимаю. Я про способы генерации этих первич...

Генерировать можно миллионом способов, но самые популярные - sequence, uuid и в триггере со своей произвольной логикой (например генерировать номер на основе полей из той же записи)

Zamira Norova
Если PK 2 типа, то как-то его можно поменять на ти...

в ПГ есть спец тип serial - он сразу создает сиквенс и щелкает циферки при вставке

V
в ПГ есть спец тип serial - он сразу создает сикве...

лучше использовать generated by default вместо serial

Zamira Norova
Это я понимаю. Я про способы генерации этих первич...

Не используется первый вариант в современных многопользовательских (many writers) СУБД (по причине отвратительной производительности). А вот в single-writer СУБД, с другой стороны: https://sqlize.online/sql/sqlite3/683fa289ae35b920e5595ede7d3e6da7/

Yaroslav Schekin
Не используется первый вариант в современных много...

к сожалению до сих пор масса легаси систем юзает метод поиска макс+1

Ilya Anfimov
Я бы не сказал.

А я бы сказал (про своё абсолютное нежелание спорить по поводу чего-либо из этой ссылки без очень существенных аргументов с другой стороны я тут уже говорил, кажется): https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_serial

Похожие вопросы

Обсуждают сегодня

Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Карта сайта