как изменить первичный ключ, чтобы установить значение по умолчанию DEFAULT SYS_GUID() в ORACLE

Я создаю таблицу в оракуле и хочу добавить автоинкремент для своего первичного ключа.

CREATE TABLE "TEST_1"."PERSON" 
   ("ID" NUMBER NOT NULL ENABLE, 
    "FNAME" VARCHAR2(20 BYTE), 
    "LNAME" VARCHAR2(20 BYTE), 
     CONSTRAINT "PERSON_PK" PRIMARY KEY ("ID"));

Используя Oracle sql development, когда я хочу изменить идентификатор, чтобы получить автоматическое увеличение для первичного ключа, я получаю сообщение об ошибке ORA-02262: ORA-932

У меня есть два необработанных в таблице

ALTER TABLE PERSON  
MODIFY (ID DEFAULT SYS_GUID() );

person noor    schedule 24.06.2015    source источник
comment
SYS_GUID() не возвращает число, поэтому тип данных не соответствует. Вам действительно нужен GUID, а не число из последовательности, назначенный через триггер? (Если вы не используете версию 12c, в которой есть функции автоматического увеличения сейчас).   -  person Alex Poole    schedule 24.06.2015
comment
Я хочу получить автоматическое увеличение идентификатора в таблице (11g). Так что только я могу использовать последовательность, спасибо   -  person noor    schedule 24.06.2015
comment
В 11g вы обычно используете последовательность и триггер для "автоинкрементного" числового столбца, особенно для PK . Однако я не уверен, хотите ли вы номер или GUID. Они не одинаковы.   -  person Alex Poole    schedule 24.06.2015


Ответы (2)


(Примечание: мой ответ и примеры используют Oracle 11g)

Причина проблемы/ошибки

Ошибка Oracle ORA-02262 возникает при наличии несовместимых типов данных. В вашем случае при создании таблицы вы указываете, что столбец ID имеет тип NUMBER:

CREATE TABLE "TEST_1"."PERSON" 
("ID" NUMBER NOT NULL ENABLE, ...

Функция SYS_GUID() в Oracle "создает и возвращает глобальный уникальный идентификатор (значение RAW), состоящий из 16 байтов). Затем в документации указано, что 16-байтовое значение RAW может быть представлено 32-символьным шестнадцатеричным представлением или VARCHAR2(32).

По этой причине, когда SYS_GUID() используется в качестве значения столбца по умолчанию в Oracle, результат часто сохраняется как 32-байтовый VARCHAR или VARCHAR2:

CREATE TABLE TEST_1.PERSON (
  ID VARCHAR2(32) NOT NULL ENABLE DEFAULT SYS_GUID(),
  ...
);

Решение(я)

Если изменение типа данных столбца является подходящим решением, приведенный ниже код успешно изменит таблицу, чтобы сохранить SYS_GUID() значений в качестве идентификаторов:

ALTER TABLE TEST_1.PERSON MODIFY( 
  ID VARCHAR2(32) DEFAULT SYS_GUID() 
);

Если вы должны иметь числовое значение в качестве идентификатора в своей таблице, здесь есть отличный ответ:

Как создать идентификатор с AUTO_INCREMENT в Oracle?

person matsuninja    schedule 17.11.2017
comment
sys_guid() следует хранить в raw(16), а не в varchar - person a_horse_with_no_name; 17.11.2017

Оракул показывает, что эта ошибка означает: // *Причина: новый тип данных столбца вызывает ошибку проверки типа для существующего столбца // выражение значения по умолчанию. // *Действие: Удалите выражение значения по умолчанию или не изменяйте // тип данных столбца.

вы не используете последовательности для этого ??

person ROHIT SHUKLA    schedule 24.06.2015
comment
можно ли как-нибудь изменить таблицу. нет последовательности - person noor; 24.06.2015
comment
Алекс прав, sys_guid() работает с типом данных RAW, поэтому вы можете использовать для него последовательности. - person ROHIT SHUKLA; 24.06.2015