使用 rand() 函数将计算列添加到现有 table

Add computed column into existed table with rand() function

我有一个 table product,想添加一个新的计算列 test,公式是 SUBSTRING(MD5(RAND()) FROM 1 FOR 16)

所以查询是这样的:

alter table product add test varchar(255) as (SUBSTRING(MD5(RAND()) FROM 1 FOR 16));

但是 returns 我的错误是

Error Code: 3763. Expression of generated column 'test' contains a disallowed function: rand.

有谁知道为什么以及如何解决它?

正如其他人在评论中所述,您不能在计算列中使用 RAND()。但是您可以使用触发器获得相同的预期结果。

首先,添加列(我称之为test_md5rand):

ALTER TABLE product add test_md5rand varchar(255);

然后添加触发器:

CREATE TRIGGER product_md5
BEFORE INSERT
ON product FOR EACH ROW
BEGIN
  SET NEW.test_md5rand = SUBSTRING(MD5(RAND()) FROM 1 FOR 16);
END

也许更新现有行:

UPDATE product
   SET test_md5rand = SUBSTRING(MD5(RAND()) FROM 1 FOR 16)
 WHERE test_md5rand IS NULL;

dbfiddle

您不能将值添加为计算列 -- 原因很简单:每次执行时值都会发生变化。从技术上讲,这是因为 rand() 是一个 volatile 函数。

如果您真的想要这个功能,您可以使用视图:

create view v_product as
    select p.*, left(md5(rand()), 16) as test
    from product p;

改变价值可能不是你想要的。正如另一个答案所暗示的,您可以使用触发器。在我看来,那也是不愉快的。

一个选项是将计算值基于现有列,例如名称:

alter table product add test varchar(16) as left(md5(product_name), 16);

此方法唯一可能的缺点是,如果列更改,则 test 也会更改。