1

古いプロジェクトでは、設計を熟考していなかったため、実際にはauto_incrementに設定する必要がある列がありますが、次のように英数字のエントリであるため、設定することはできません。

c01
c02
c03

(c99はc100以上を継続します)、手紙は過去に起こったものであり、それを取り除くためにシステムをオーバーホールする必要があるので、私はむしろこの回避策を好みます。

ここで、SQLステートメントを使用して機能を模倣する方法が必要ですauto_increment。私自身の試みは、次のようになっています。

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 に答える