3

簡潔にするために、numbers2 つの列を持つテーブルがあると仮定しましょう: id& number:

CREATE TABLE numbers(
   id INT NOT NULL AUTO_INCREMENT,
   NUMBER INT NOT NULL,
   PRIMARY KEY ( id )
);

number列を自動インクリメントしたいのですが、 100 に達した後は 1 から再開し、次の要件を満たします。

  1. まだレコードがない場合は、number1 に設定します。
  2. テーブルにすでにレコードがある場合:
    1. 最後のレコードnumberが 100 未満の場合はnumber、その + 1 に設定します。
    2. 最後のレコードnumberが 100 件以上の場合はnumber1 に設定します。

これが私がこれまでに持っているものです:

INSERT INTO `numbers` (`number`)
VALUES (
    IF(
        IFNULL(
            (SELECT `number`
            FROM `numbers` as n
            ORDER BY `id` DESC
            LIMIT 1),
            0
        ) > 99,
        1,
        IFNULL(
            (SELECT `number`
            FROM `numbers` as n
            ORDER BY `id` DESC
            LIMIT 1),
            0
        ) + 1
    )
)

これは機能しますが、2 つの同一のSELECTクエリを使用します。

重複を削除する方法はありますSELECTか?


PS私はクエリ内でこれをすべてやりたいです。トリガーやストアド プロシージャはありません。

4

3 に答える 3

3

モジュロ%演算子を使用してみてください

INSERT INTO `numbers` (`number`)
VALUES (
          IFNULL(
            (SELECT `number`
            FROM `numbers` as n
            ORDER BY `id` DESC
            LIMIT 1),
            0
        ) % 100 + 1
    )
于 2014-01-10T06:18:59.717 に答える
2

一時変数を使用できます。

INSERT INTO `numbers`(`number`) VALUES (
  IF((@a := IFNULL((SELECT number FROM `numbers` AS n ORDER BY id DESC LIMIT 1), 0)) > 99, 1, @a + 1)
);
于 2014-01-10T06:12:54.740 に答える
1

分かりました。モジュロの答えはいいです。述べたように「100以上」の要件を処理しないため、私には「もろい」と感じます。要件を「最後のレコードの番号がちょうど 100 の場合、番号を 1 に設定する」に変更しても問題ありません。

私にとって、これはより直感的です:

INSERT INTO numbers (number)
SELECT 
  CASE 
    WHEN number >= 100 THEN 0
    ELSE COALESCE (number, 0)
  END + 1
FROM numbers
ORDER BY id DESC
LIMIT 1
于 2014-01-10T06:02:49.440 に答える