【问题标题】:MySQL insert an unique ID for specific columnsMySQL 为特定列插入唯一 ID
【发布时间】:2023-04-09 09:11:01
【问题描述】:

在 MySQL 5.5 & 5.7 中,如果有一个有 4 列的表,"a,b,c,d"

a,b,c,d
1,1,0,0
1,1,0,1
1,2,0,1
1,3,0,1

我们是否可以根据现有表中列 a 和 b 的每个唯一组合添加另一个唯一的“ID”列(int 或 bigint)?例如:

ID,a,b,c,d
1,1,1,0,0
1,1,1,0,1
2,1,2,0,1
3,1,3,0,1

另外,假设 b 列现在是一个字符串:

ID,a,b,c,d
1,1,Joe,0,0
1,1,Joe,0,1
2,1,Peter,0,1
3,1,Jan,0,1

我尝试了 AUTO_INCREMENT & UNIQUE,这似乎在这里不起作用,除非我错过了什么。有哪位大师能开导吗?谢谢!

【问题讨论】:

    标签: mysql unique auto-increment uniqueidentifier


    【解决方案1】:

    楚巴卡!

    您可以使用 CONCAT 和 LPAD 函数合并 a 列和 b 列。

    LPAD 对于避免以下冲突很重要:

    CONCAT('1','10') = '110'
    CONCAT('11','0' = '110'
    
    
    
    SELECT CAST(CONCAT(a,LPAD(b,10,'0')) as UNSIGNED) id
         , a
         , b
         , c
         , d
      FROM table_a;
    

    或者干脆

    UPDATE table_a SET id = CAST(CONCAT(a,LPAD(b,10,'0'));
    

    【讨论】:

    • 谢谢@Pastor !!!这在上面的例子中很棒!但是有没有更好的方法在 INT/BIGINT 中获取唯一 ID,如果列“b”是字符串,可以更快地在这个唯一 ID 上进行 JOIN?
    • 我只是在上面添加了一个示例,其中“b”列是字符串。你能开导吗?
    【解决方案2】:

    编写一个查询,为ab 的每个组合分配一个递增数字,然后将其与UPDATE 查询中的原始表连接起来。

    UPDATE yourTable AS t1
    JOIN (SELECT a, b, @counter := counter + 1 AS id
          FROM (SELECT DISTINCT a, b FROM yourTable ORDER BY a, b) AS x
          CROSS JOIN (SELECT @counter := 0) AS var) AS t2
    ON t1.a = t2.a AND t1.b = t2.b
    SET t1.id = t2.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2011-10-30
      • 2011-12-03
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多