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

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

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

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

18 ответов

15 просмотров

да, поэтому 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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта