HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Мы уже создавали значения первичных ключей самостоятельно. Так можно делать в учебных целях, но в промышленной разработке эту задачу берут на себя СУБД. За это отвечает механизм автогенерации. В этом уроке мы разберем принцип его работы.</p>
1 <p>Мы уже создавали значения первичных ключей самостоятельно. Так можно делать в учебных целях, но в промышленной разработке эту задачу берут на себя СУБД. За это отвечает механизм автогенерации. В этом уроке мы разберем принцип его работы.</p>
2 <h2>Автогенерация первичного ключа</h2>
2 <h2>Автогенерация первичного ключа</h2>
3 <p>Первичный ключ в базах данных принято заполнять автоматически, используя встроенные в базу данных возможности. Такой подход лучше ручного заполнения по двум причинам. Во-первых, это просто реализовать. Во-вторых, база данных сама следит за уникальностью во время генерации.</p>
3 <p>Первичный ключ в базах данных принято заполнять автоматически, используя встроенные в базу данных возможности. Такой подход лучше ручного заполнения по двум причинам. Во-первых, это просто реализовать. Во-вторых, база данных сама следит за уникальностью во время генерации.</p>
4 <p>Автогенерация работает по следующим принципам:</p>
4 <p>Автогенерация работает по следующим принципам:</p>
5 <ul><li>Внутри базы создается отдельный счетчик, который привязывается к каждой таблице</li>
5 <ul><li>Внутри базы создается отдельный счетчик, который привязывается к каждой таблице</li>
6 <li>Счетчик увеличивается на единицу при вставке новой строки</li>
6 <li>Счетчик увеличивается на единицу при вставке новой строки</li>
7 <li>Получившееся значение записывается в поле, которое помечается как автогенерируемое</li>
7 <li>Получившееся значение записывается в поле, которое помечается как автогенерируемое</li>
8 </ul><p>Автогенерацию первичного ключа часто называют автоинкрементом (autoincrement). Что переводится как<em>автоматическое увеличение</em>и напоминает операцию инкремента из программирования<em>++</em>.</p>
8 </ul><p>Автогенерацию первичного ключа часто называют автоинкрементом (autoincrement). Что переводится как<em>автоматическое увеличение</em>и напоминает операцию инкремента из программирования<em>++</em>.</p>
9 - <p>До определенного момента механизм автоинкремента был реализован по-своему в каждой СУБД разными способами. Это создавало проблемы при переходе от одной СУБД к другой и усложняло реализацию программного слоя доступа к базе данных.</p>
9 + <p>До определенного момента механизм автоинкремента был реализован по-своему в каждой СУБД разными способами. Это создавало проблемы при переходе от одной СУБД к другой и уложняло реализацию программного слоя доступа к базе данных.</p>
10 <p>Эта функциональность добавлена в стандарт SQL</p>
10 <p>Эта функциональность добавлена в стандарт SQL</p>
11 <p>, то есть очень давно. И только в 2018 году PostgreSQL в версии 10 стал его поддерживать. Такой автоинкремент известен под именем<strong>GENERATED AS IDENTITY</strong>:</p>
11 <p>, то есть очень давно. И только в 2018 году PostgreSQL в версии 10 стал его поддерживать. Такой автоинкремент известен под именем<strong>GENERATED AS IDENTITY</strong>:</p>
12 <p>Этот запрос вернет:</p>
12 <p>Этот запрос вернет:</p>
13 <p>Если удалить запись с id равным двум и вставить еще одну запись, то значением поля id будет 3. Автогенерация не связана с данными в таблице. Это отдельный счетчик, который всегда увеличивается. Так избегаются вероятные коллизии и ошибки, когда один и тот же идентификатор принадлежит сначала одной записи, а потом другой.</p>
13 <p>Если удалить запись с id равным двум и вставить еще одну запись, то значением поля id будет 3. Автогенерация не связана с данными в таблице. Это отдельный счетчик, который всегда увеличивается. Так избегаются вероятные коллизии и ошибки, когда один и тот же идентификатор принадлежит сначала одной записи, а потом другой.</p>
14 <p>Вот его структура из документации:</p>
14 <p>Вот его структура из документации:</p>
15 <p>column_name type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]</p>
15 <p>column_name type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]</p>
16 <ul><li><p>Тип данных может быть<em>SMALLINT</em>,<em>INT</em>или<em>BIGINT</em></p>
16 <ul><li><p>Тип данных может быть<em>SMALLINT</em>,<em>INT</em>или<em>BIGINT</em></p>
17 </li>
17 </li>
18 <li><p>GENERATED ALWAYS - не позволит добавлять значение самостоятельно, используя UPDATE или INSERT</p>
18 <li><p>GENERATED ALWAYS - не позволит добавлять значение самостоятельно, используя UPDATE или INSERT</p>
19 </li>
19 </li>
20 <li><p>GENERATED BY DEFAULT - в отличие от предыдущего варианта, этот вариант позволяет добавлять значения самостоятельно</p>
20 <li><p>GENERATED BY DEFAULT - в отличие от предыдущего варианта, этот вариант позволяет добавлять значения самостоятельно</p>
21 </li>
21 </li>
22 </ul><p>PostgreSQL позволяет иметь более одного автогенерируемого поля на таблицу.</p>
22 </ul><p>PostgreSQL позволяет иметь более одного автогенерируемого поля на таблицу.</p>
23 <h2>Выводы</h2>
23 <h2>Выводы</h2>
24 <p>В этом уроке мы разобрали автогенерацию. Теперь вы знаете, как работают ее механизмы и как происходит автогенерация первичного ключа.</p>
24 <p>В этом уроке мы разобрали автогенерацию. Теперь вы знаете, как работают ее механизмы и как происходит автогенерация первичного ключа.</p>