我想将一个自定义列显示为别名,但需要使用自动字符来增加。
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
答案 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
答案 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