Похоже, что в Oracle нет понятия AUTO_INCREMENT, вплоть до версии 11g включительно.
Как я могу создать столбец, который ведет себя как автоинкремент в Oracle 11g?
sql
oracle
auto-increment
Сушан Гимир
источник
источник
BEFORE INSERT
триггер на таблице и извлечь значения из последовательности, чтобы создать автоинкрементОтветы:
В Oracle 11g нет такой вещи, как столбцы «auto_increment» или «identity» . Однако вы можете легко смоделировать его с помощью последовательности и триггера:
Определение таблицы:
Определение триггера:
ОБНОВИТЬ:
IDENTITY
колонка теперь доступна в Oracle 12c:или укажите начальное значение и значение приращения, также предотвращая любую вставку в столбец идентификации (
GENERATED ALWAYS
) (опять же, только для Oracle 12c +)Кроме того, Oracle 12 также позволяет использовать последовательность в качестве значения по умолчанию:
источник
dept_seq
пришел!SELECT .. INTO
в триггере вы можете просто сделать:new.id := dept_seq.NEXTVAL;
.SYS_GUID
возвращает GUID-- глобально уникальный идентификатор. АSYS_GUID
этоRAW(16)
. Он не генерирует возрастающее числовое значение.Если вы хотите создать увеличивающийся цифровой ключ, вам нужно создать последовательность.
Затем вы либо используете эту последовательность в своем
INSERT
заявленииИли вы можете определить триггер, который автоматически заполняет значение первичного ключа, используя последовательность
Если вы используете Oracle 11.1 или новее, вы можете немного упростить триггер
Если вы действительно хотите использовать
SYS_GUID
источник
CACHE 100; in CREATE SEQUENCE name_of_sequence START WITH 1 INCREMENT BY 1 CACHE 100;
?SYS_GUID()
этоRAW(16)
не 32.SYS_GUID
Документация объявляетraw(32)
который меня смутил.В Oracle 12c и далее вы можете сделать что-то вроде:
И в Oracle (до 12с).
источник
IDENTITY
пример гораздо яснее в этом ответе.WHEN (new.MAP_ID IS NULL)
Не в общепринятом ответ. Upvoted.WHEN ( new.MAP_ID is null)
не очень хороший код в данном случае, и он уже объяснен в разделе комментариев @ABCade под принятым ответом .. прочитайте;)CREATE OR REPLACE TRIGGER
вEND;
, я получаю окно «Enter Binds». Если я нажимаю «Применить» и больше ничего не делаю в этом окне, а затем запускаюALTER TRIGGER
команду, все хорошо, но хотелось бы, чтобы был способ программно избавиться от этого всплывающего окна и запустить все вместе. Если вы попробуете это вообще, вы получите,PLS-00103: Encountered the symbol 'ALTER'
и это не нравитсяEXECUTE IMMEDIATE
, (та же ошибка, просто говорит этоEncountered the symbol 'EXECUTE'
вместо этого).[42000][907] ORA-00907: missing right parenthesis
при запуске версии для Oracle 12c и выше. Есть идеи ?Вот три вкуса:
RAW
тип данных.x
это столбец идентификации. ЗаменитеFOO
своим именем таблицы в каждом из примеров.Обновить:
Oracle 12c представляет эти два варианта, которые не зависят от триггеров:
Первый использует последовательность традиционным способом; вторая управляет значением внутри страны.
источник
Предполагая, что вы имеете в виду такой столбец, как столбец идентификаторов SQL Server?
В Oracle вы используете ПОСЛЕДОВАТЕЛЬНОСТЬ для достижения той же функциональности. Я посмотрю, смогу ли я найти хорошую ссылку и опубликовать ее здесь.
Обновление: похоже, что вы нашли это сами. Вот ссылка в любом случае: http://www.techonthenet.com/oracle/septions.php
источник
Oracle Database 12c представила Identity, автоинкрементный (сгенерированный системой) столбец. В предыдущих версиях базы данных (до 11g) Identity обычно реализовывался путем создания последовательности и триггера. Начиная с 12c, вы можете создать свою собственную таблицу и определить столбец, который должен быть создан как идентификатор.
Следующая статья объясняет, как его использовать:
Столбцы идентификации - новая запись в Oracle Database 12c
источник
Trigger
иSequence
может использоваться, когда вам нужен серийный номер, который каждый может легко прочитать / запомнить / понять. Но если вы не хотите таким образом управлять столбцом идентификаторов (например, emp_id), и значение этого столбца невелико, вы можете использовать егоSYS_GUID()
при создании таблицы, чтобы получить автоматическое увеличение, например, так.Теперь ваш
emp_id
столбец будет принимать «значение глобального уникального идентификатора». Вы можете вставить значение в таблицу, игнорируя столбец emp_id следующим образом.Таким образом, он вставит уникальное значение в ваш
emp_id
столбец.источник
SYS_GUID()
его значения id также?Начиная с Oracle 12c, существует поддержка столбцов Identity одним из двух способов:
Sequence + Table - В этом решении вы по-прежнему создаете последовательность, как обычно, а затем используете следующий DDL:
CREATE TABLE MyTable (ID НОМЕР ПО УМОЛЧАНИЮ MyTable_Seq.NEXTVAL , ...)
Только таблица - в этом решении последовательность не указана явно. Вы бы использовали следующий DDL:
СОЗДАТЬ ТАБЛИЦУ MyTable ( ИДЕНТИФИКАТОР ИДЕНТИФИКАЦИИ , ...)
Если вы используете первый способ, он обратно совместим с существующим способом ведения дел. Второй немного более простой и более интегрированный с остальными системами RDMS.
источник
это называется
Identity Columns
и доступно только из оракула Oracle 12cпример вставки в
Identity Columns
как показано нижеВы не можете сделать вставку, как показано ниже
полезная ссылка
источник
Вот полное решение по обработке исключений / ошибок для автоматического приращения, это решение обратно совместимо и будет работать на 11g и 12c, особенно если приложение находится в производстве.
Пожалуйста, замените "TABLE_NAME" на соответствующее имя таблицы
источник
Вот как я сделал это на существующей таблице и столбце (с именем id):
источник
источник
источник
у оракула есть последовательности И столбцы идентичности в 12c
http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php#identity-columns
Я нашел это, но не уверен, что такое rdb 7 http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf
источник
только я должен просто изменить имя таблицы (AUDITLOGS) с вашим именем таблицы и new.id с new.column_name
источник
Может быть, просто попробуйте этот простой скрипт:
http://www.hlavaj.sk/ai.php
Результат:
источник
select
в современных версиях Oracle. Вы можете просто использовать:new.pk := TABLE_PK_SEQ.NEXTVAL