【问题标题】:DB2 - ALTER table ADD column with unique default value (UUID)DB2 - ALTER 表添加具有唯一默认值 (UUID) 的列
【发布时间】:2020-04-23 23:40:36
【问题描述】:

我需要通过添加一个默认值为 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 查询中调用自定义函数的正确格式是什么,或者有任何建议来实现上述要求。

提前致谢。

【问题讨论】:

  • 您不能在DEFAULT 子句中指定函数名。检查CREATE TABLE 语句中的Default-values 可能选项。真的有必要使用varchar(255)generate_unique吗?为什么不使用一些数字(int/bigint/decimal)数据类型的生成列?
  • 应该提到 Db2 的平台和版本,但我认为在这种情况下不会有什么不同。

标签: database function db2 uuid alter-table


【解决方案1】:

您需要通过触发器而不是生成的表达式来执行此操作。给定 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

【讨论】:

    【解决方案2】:

    我能够通过以下方式实现它:

    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';
    

    【讨论】:

      【解决方案3】:

      ALTER TABLE ADD ID_VALUE AS (UUID_FUNC());

      为了访问现有的字段值, ALTER TABLE ADD ID_VALUE AS (UUID_FUNC([field_name]));

      【讨论】:

      • 它不起作用,运行此查询时出现以下错误 - SQL Error [42601]: An unexpected token "ALTER TABLE ADD" was found following "BEGIN-OF-STATEMENT". Expected tokens may include: "&lt;create_view&gt;".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.59.81
      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2021-01-17
      相关资源
      最近更新 更多