【问题标题】:How to get different auto_increment value depending on value of different key如何根据不同键的值获取不同的 auto_increment 值
【发布时间】:2019-08-08 18:47:44
【问题描述】:

我为待办事项设置了一个表格,主要列是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这样的东西

【问题讨论】:

  • 除非您提供哈希,否则 innodb 自动增量不会这样做。
  • 然而,myisam 可以做到这一点。
  • @PeterHe 你知道有什么指南可以帮助我在 myisam 中重新创建它吗?
  • 您将哈希定义为 int not null auto_increment、owner int not null 和其他列。然后在所有者和哈希列上定义一个 PK。请记住,myisam 不支持交易。

标签: mysql mariadb innodb


【解决方案1】:

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

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 及更高版本)而不是子查询row_number() 的MySQL 版本中,可以在视图中使用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2016-11-06
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多