2012-04-20 44 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);