DB2 - столбец ADD таблицы ALTER с уникальным значением по умолчанию (UUID) - PullRequest
2 голосов
/ 06 января 2020

Мне нужно обновить существующую таблицу, добавив новый столбец со значением по умолчанию как UUID и типом данных как VARCHAR (255).

Я пытался добиться этого, написав функцию как:

CREATE FUNCTION UUID_FUNC()
     RETURNS VARCHAR(255)
     LANGUAGE SQL 
     BEGIN ATOMIC
     DECLARE UUID VARCHAR(4000);
     SET UUID = (SELECT TRIM(CHAR(HEX(GENERATE_UNIQUE()))) from sysibm.sysdummy1);
     RETURN UUID;
END

И использовал его в запросе как:

ALTER TABLE <Table-name> 
    ADD ID_VALUE VARCHAR(255) NOT NULL DEFAULT (UUID_FUNC())

Произошла следующая ошибка при выполнении вышеуказанного запроса:

SQL Error [42601]: An unexpected token "DEFAULT" was found following "ARCHAR(255) NOT NULL".  
Expected tokens may include:  "CHECK".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.59.81

Какой правильный формат для вызова пользовательских функций в Запрос ALTER или любые предложения для достижения вышеуказанного требования приветствуется.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 11 января 2020

Это необходимо сделать с помощью триггера, а не сгенерированного выражения. Учитывая DDL:

create or replace function your.uuid_func()
   returns char(26)
   language sql
   not deterministic
   return values(hex(generate_unique()));

create table your.table (
   c1 int not null,
   c2 char(26) not null
);

Вы можете создать триггер:

create trigger set_uuid
   before insert on your.table
   referencing new as n
   for each row
   when (n.id_value is null)
      set n.id_value = your.uuid_func();

Тогда вставка:

—- You can insert a normal string:
insert into your.table (c1, c2)
   values (1, ‘anything’);


—- Or, if you don’t provide a value for c2, it will be set
—- to the value of UUID_FUNC():

insert into your.table (c1) 
    values (2);

Результаты:

select * from your.table;

C1          C2                        
----------- --------------------------
          1 anything                     
          2 20200111154913255440000000
0 голосов
/ 24 января 2020

Мне удалось добиться этого следующим образом:

ALTER TABLE <Table-name> ADD ID_VALUE VARCHAR(255) NOT NULL DEFAULT '0';

UPDATE <Table-name> SET ID_VALUE=(hex(GENERATE_UNIQUE())) WHERE ID_VALUE='0';
0 голосов
/ 06 января 2020

ALTER TABLE ADD ID_VALUE AS (UUID_FUN C ());

Для доступа к существующим значениям полей, ALTER TABLE ADD ID_VALUE AS (UUID_FUN C ([field_name]));

...