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>