如何使用自动递增字符创建自定义列
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
我想显示一个自定义列作为别名,但需要使用自动字符递增。
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