如何使用自动递增字符创建自定义列

How to create custom column with auto-increment characters

我想显示一个自定义列作为别名,但需要使用自动字符递增。

id      subid   dollar  packetname
168     355     5813    ND-1
169     355     359     ND-1
170     356     559     ND-2
171     362     4536    ND-10
172     362     484     ND-10
134     329     4698    ND-12
135     329     435     ND-12
125     330     6293    ND-13
126     330     4293    ND-13
127     330     693     ND-13

我需要一个带有另一个更新数据包的输出。 带有自动递增字符的列

id      subid   dollar  packetname      updated packet
168     355     5813    ND-1            ND-1
169     355     359     ND-1            ND-1A
170     356     559     ND-2            ND-2
171     362     4536    ND-10           ND-10
172     362     484     ND-10           ND-10A
134     329     4698    ND-12           ND-12
135     329     435     ND-12           ND-12A
125     330     6293    ND-13           ND-13
126     330     4293    ND-13           ND-13A
127     330     693     ND-13           ND-13B

我认为最好的办法是 SELECT 输出当前数据包 table,沿途对其进行修改,然后 INSERT 将其变成新的 table。完成此操作后,您可以删除原来的table,然后将新的重命名为旧的

INSERT INTO newpacket (id, subid, dollar, packetname, `updated packet`)
SELECT p1.id, p1.subid, p1.dollar, p1.packetname, p2.`updated packet`
FROM packet p1
INNER JOIN
(
    SELECT p.id, p.subid,
        CASE WHEN (SELECT p.id - MIN(t.id) FROM packet t WHERE t.subid = p.subid) > 0
        THEN CONCAT(packetname,
                    CHAR(((SELECT p.id - MIN(t.id) FROM packet t WHERE t.subid = p.subid) + 64) USING utf8))
        ELSE packetname END AS `updated packet`
    FROM packet p
) p2
ON p1.subid = p2.subid AND p1.id = p2.id

您可以创建触发器。

create trigger my_trigger before insert on mytable for each row 
begin
DECLARE samecount INT;
  set samecount = ( select count(*) from mytable where packetname = new.packetname );
  if samecount = 0 then
    set new.updated_packet = new.packetname;
  else
    set new.updated_packet = concat(new.packetname,conv(samecount+9,10,36));
  end if;
end;

在插入新行之前,它会计算有多少行具有相同的packetname。当有一个或多个时,count+9 被转换为 base 36 - 它几乎与 HEX 相同,除了一直到 Z。因此,如果 count 为 1,它变为 1+9=10=A。结果值与 packetname 连接。 如果相同的行超过 37,它不会失败,但会附加 10 代替 38。

请记住,这并不完全是 auto increment,它可能会受到竞争条件的影响,当两个用户在完全相同的时间插入相同的 packetname 时,计数查询可以 return 两者的值相同。

编辑: 请注意,此解决方案适用于之后需要将 new 行插入 table 并希望它们自动填充 updated_packet 的情况。如果您还想更新现有行,一种方法是创建一个具有相同结构的新 table,在新 table 上创建该触发器,然后执行

insert into newtable(id, subid, dollar, packetname)
select id, subid, dollar, packetname from oldtable

您可以使用这样的查询来创建额外的字段

SELECT concat(packetname, 
              elt(if(@t=packetname, @n:=@n+1, @n:=1),
                  '','A','B','C','D','E','F','G')) `updated packet`, 
       id, subid, dollar, @t:=packetname packetname
    FROM t
      cross join
         (SELECT @n:=1, @t:="") n
  order by packetname

demo on sqlfiddle