如何根据不同键的值获取不同的auto_increment值

时间:2019-08-08 18:47:44

标签: mysql mariadb innodb

我为待办事项设置了表格,主要列为hashowner。我希望以这样一种方式进行设置:hash根据owner的值自动递增,如果删除了一个值,则所有hash的值都会自动以新的递增值更新

假设有3个用户,为简单起见,我将在owner中将其ID设置为1、2和3。每个用户都有3个项目,表格如下所示

hash owner
1        1
2        1
3        1
1        2
2        2
3        2
1        3
2        3
3        3

如果我要为所有者1添加一个新条目,它将自动将哈希值增加到4,从而创建一个这样的表

hash owner
1        1
2        1
3        1
4        1
1        2
2        2
3        2
1        3
2        3
3        3

然后,如果我运行DELETE FROM todo WHERE hash = 2 AND owner = 1,则链接到所有者1的条目的哈希将更改为1 | 2 | 3,而不是1 | 3 | 4

如果我然后使用INSERT INTO todo SET owner = 4添加新用户,他们将获得自己的“哈希集”。

这是完全可能还是我要求太多?

我要这样做的唯一原因是,每个用户都可以拥有自己容易记住的哈希,而不是像jIUxdi3XjaDv

这样的哈希。

1 个答案:

答案 0 :(得分:0)

您可以在表格中创建一个普通的自动增量列。

CREATE TABLE elbat
             (ordinal integer
                      NOT NULL
                      AUTO_INCREMENT,
              owner integer,
              UNIQUE (ordinal));

如果需要,您也可以使其成为表的主键,而不仅仅是声明其唯一性。

然后使用一个视图,该视图通过计算小于或等于当前自动增量列的出现次数来计算哈希值。

CREATE VIEW weiv
AS
SELECT (SELECT count(*)
               FROM elbat t2
               WHERE t2.owner = t1.owner
                     AND t2.ordinal <= t1.ordinal) hash,
       t1.owner
       FROM elbat t1;

db<>fiddle

在视图中可以使用支持row_number()(版本8.0及更高版本)的MySQL版本而不是子查询row_number()

CREATE VIEW weiv
AS
SELECT row_number() OVER (PARTITION BY t1.owner
                          ORDER BY t1.ordinal) hash,
       t1.owner
       FROM elbat t1;