为了简洁起见,我们假设我们有一个numbers
表,其中有两列:id
& number
:
CREATE TABLE numbers(
id INT NOT NULL AUTO_INCREMENT,
NUMBER INT NOT NULL,
PRIMARY KEY ( id )
);
我希望number
列自动增加,但在达到100之后从1重新启动,满足以下要求:
number
设置为1。number
小于100,请将number
设为+ 1。number
为100或更高,请将number
设为1。这是我到目前为止所拥有的:
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
)
)
这可行,但使用两个相同的SELECT
个查询。
有没有办法删除重复的SELECT
?
P.S。我想在查询中完成所有这些操作。没有触发器或存储过程。
答案 0 :(得分: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)
);
答案 1 :(得分:2)
尝试使用modulo %
运算符
INSERT INTO `numbers` (`number`)
VALUES (
IFNULL(
(SELECT `number`
FROM `numbers` as n
ORDER BY `id` DESC
LIMIT 1),
0
) % 100 + 1
)
答案 2 :(得分: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