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

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

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

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

18 ответов

6 просмотров

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

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
А чем вам питонисты не угодили?😂
.
79
доброго времени. db, dw и прочие исполняются при трансляции или при выполнении программы?
lutayyy
10
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Есть предложения, как подобное можно упростить?
Hemul GM
12
@y0zhig @shizzard А можно я опишу цель и может вообще ерланг мне не подходит. На текущий момент как я понимаю у ерланга есть легковесные потоки и задача выполняется в каком т...
Дмитрий Спиридонов
5
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
Карта сайта