2012-04-20 77 views
1

一个老项目,因为不通过设计想我有这实际上应被设置为AUTO_INCREMENT列,但它不能因为它有如下的字母数字条目:通过值1增加字母数字VARCHAR条目?

c01 
c02 
c03 

(C99将继续C100和更多),信过去发生的事情,它需要检修系统把它拿出来,所以我宁可选择这种解决方法。

现在我需要一种方法来模仿auto_increment功能与SQL语句我自己,我自己尝试尽可能得到如下所示:

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

任何想法如何做到这一点增加了吗?

通过我也不能肯定,如果你只是可以增加通过这样的方式的字母数字输入,虽然我知道这是可以做到的方式,我只是不知道怎么办。

+0

你确定所有的身份密钥总是形式为'C## ..'吗? – mellamokb 2012-04-20 22:51:44

+0

你必须去C100或者你可以只是去D01?或者怎么样c9A.c9b,C9C,c9d ......然后CAA驾驶室CAC .. cba..cbb..ccc ...等关键的真的不应该是智能的。他们只需要是独一无二的。 – xQbert 2012-04-20 23:01:48

+0

另一个接近这种方式将是对这一分成两列,并使用'CONCAT(id_char,ID_NUMBER)'的两列,而不只是'SELECT'ing的ID。根据具体情况,这种改变可能不需要太多工作。另外,根据具体情况,这可能会让您拥有一个非常高效的系统。 – Jasper 2012-04-20 23:07:10

回答

3

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

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

然后insert语句会是这个样子:

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

+0

这是错误的,它不会追加前导零如果需要 – 2012-04-20 23:20:59

+0

轻松修复:)看到更新 – mellamokb 2012-04-20 23:29:21

+0

没有改变投票;) – 2012-04-20 23:37:16

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);