首页 > 解决方案 > 为第 1 列和第 2 列的每个新组合生成新 ID

问题描述

我想为第 1 列和第 2 列的每个新组合生成一个新的 ID 号。例如:

ID | column 1 | column 2
1  | peter    | blue
2  | mark     | red
1  | peter    | blue

由于随着时间的推移会添加新的行和新的值,这应该能够自动更新。我尝试了 DENSE_RANK(),这似乎有效。但是当我把它作为一个计算列中的语句时它给出了一个错误,所以我想这是不可能的?(对 SQL 来说仍然很新)。

谢谢你的帮助!

错误消息:#1901 - 函数或表达式 'dense_rank()' 不能在 `ProductIdentifier 的 GENERATED ALWAYS AS 子句中使用

编辑: 我基本上想要的是基于 2 列将一行链接到另一个表。当然,我也可以连接两列,但我在某处读到,使用字符串执行此操作会更慢。它最终将是一个大表,目前有 200.000 多行并增长到数百万行。这是我可以/应该做的事情吗?

标签: sqlmariadbwindow-functionsmariadb-10.3

解决方案


正如您所发现的,您不能在生成的列中使用窗口函数。但是,您可以在视图中动态计算信息:

create view myview as
select id, column1, column2, dense_rank() over(order by column1, column2) rn
from mytable

然后您可以查询视图而不是表,例如:

select * from myview;

推荐阅读