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

时间:2015-12-17 08:31:23

标签: mysql auto-increment

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

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

3 个答案:

答案 0 :(得分:2)

我认为最好的办法是SELECT当前的数据包表,一路修改它,并INSERT将它放入一个新的表中。完成此操作后,您可以删除原始表,然后将新表重命名为旧表。

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

答案 1 :(得分:2)

您可以使用此类查询来制作其他字段

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

答案 2 :(得分:1)

您可以创建触发器。

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时,计数查询可以返回两者的价值相同。

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

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