1

在一个旧项目上,由于没有经过设计考虑,我有一个实际上应该设置为 auto_increment 的列,尽管它不能是因为它是字母数字条目,如下所示:

c01
c02
c03

(c99 将继续 c100 及更多),这封信发生在过去,需要对系统进行大修才能将其取出,因此我更喜欢这种解决方法。

现在我需要一种方法来自己模仿auto_incrementSQL 语句的功能,我自己的尝试已经达到了以下几点:

INSERT INTO tags (tag_id, tag_name, tag_description, added_by_user_id, creation_date, last_edited) VALUES (SELECT(MAX(tag_id)+1), 

'Love', 'All about love', 7, now(), 0);

这个不能按原样工作,尽管想法是选择“tag_id”列中的最高条目,然后简单地将其增加值 1。

任何想法如何做到这一点?

顺便说一句,我也不确定您是否可以通过这种方式简单地增加字母数字条目,虽然我知道可以做到,但我只是不知道怎么做。

4

2 回答 2

3

如果您想安全地获取表单标签 id 的最大整数值c##..,可以使用以下表达式:

max( convert( substring(tag_id, 2) , unsigned integer) )
^^^ largest   ^^^^^^^^^ after 'c'    ^^^^^^^^^^^^^^^^ convert to positive number

然后您的插入语句将如下所示:

set @newid = convert(
              (select 
               max(convert( (substring(tag_id, 2)) , unsigned integer))+1
               from tags), char(10)
            );

set @newid = if(length(@newid) = 1, concat('0', @newid), @newid);
set @newid = concat('c', @newid);

INSERT INTO tags (tag_id, tag_name, tag_description, added_by_user_id,
                  creation_date, last_edited)
VALUES (@newid, 'Love', 'All about love', 7, now(), '2012-04-15');

演示:http ://www.sqlfiddle.com/#!2/0bd9f/1

于 2012-04-20T23:00:59.980 回答
1

这将从 c01 增加到 c02 到 c03 ... 到 c99 到 c100 到 c101 ... 到 c999 到 c1000 等。

set @nextID = (SELECT CONCAT(SUBSTRING(`tag_id`, 1, 1), IF(CHAR_LENGTH(CAST(SUBSTRING(`tag_id`, 2)
AS UNSIGNED)) < 2, LPAD(CAST(CAST(SUBSTRING(`tag_id`, 2) AS UNSIGNED) + 1 AS CHAR), 2,
'0'), CAST(CAST(SUBSTRING(`tag_id`, 2) AS UNSIGNED) + 1 AS CHAR))) FROM `tags` ORDER BY
`tag_id` DESC LIMIT 1);


INSERT INTO tags (tag_id, tag_name, tag_description, added_by_user_id,
creation_date, last_edited) VALUES (@nextID, 'Love', 'All about love', 7, NOW(), null);
于 2012-04-20T23:12:17.177 回答