这是我的表,id字段为带有NOT NULL和AUTO_INCREMENT的unsigned tinyint PRIMARY KEY。
+----+
| id |
+----+
| 1 |
| 4 |
|254 |
|255 |
+----+
我的应用程序是一个嵌入式应用程序,所以我使用像tinyint这样的小数据类型。我的id值总数不会达到255.但是如果中间值被删除多次,那么插入新的id值肯定会迟早达到255.
我有一些问题,
是否可以设置自动增量功能,以便将新ID插入到不存在的更大值(此处为2)?
如果没有,请建议一些处理此问题的方法,除了使用更高的数据类型的id并在删除id后更新更高的id值(如果我删除id = 2将所有id值大于2更新为id- 1,以便在插入新值时所有值保持顺序)。
答案 0 :(得分:1)
附加要插入的字段。这将使用最低的免费ID
INSERT INTO ai (id) (
SELECT a.id+1 FROM ai a
LEFT JOIN ai b ON a.id+1 = b.id
WHERE b.id IS NULL LIMIT 1
)
或者得到1
SELECT a.id+1 FROM (
SELECT 0 AS id UNION SELECT id FROM ai
) AS a
LEFT JOIN ai b ON a.id+1 = b.id
WHERE b.id IS NULL
ORDER by a.id ASC
LIMIT 1;
答案 1 :(得分:0)
我无法思考为什么你选择受这个任意限制的约束。也就是说,如果要这样做,那么我将构建一个包含所有可能整数的表(1-255)和一个表示该值当前是否正在使用的标志。因此DELETE变为UPDATE x SET flag = 0 WHERE id = n
。然后查找最低0标志的查询变得微不足道。
答案 2 :(得分:0)
@
Edge Goldberg - 如果你想重新排序,并使用auto_increment使用它。然后lst_insertid也可以工作 - : - 删除一行后 UPDATE abc,(SELECT @nr:= 0)AS INIT SET a:= @nr:=(@ nr + 1); ALTER TABLE abc AUTO_INCREMENT = 1;
- 插入一个新的 插入abc(a)VALUES(1234); SELECT LAST_INSERT_ID();
答案 3 :(得分:0)
以下是set auto_increment
的示例MariaDB []> select * from abc;
+-------+------+
| a | b |
+-------+------+
| 00001 | 2 |
| 00002 | 3 |
| 00004 | 5 |
| 00005 | 6 |
| 00007 | 8 |
| 00008 | 9 |
| 00009 | 10 |
| 00010 | 11 |
| 00012 | 13 |
| 00013 | 14 |
| 00014 | 15 |
| 00015 | 16 |
| 00016 | 17 |
| 00017 | 18 |
| 00018 | 19 |
| 00033 | 34 |
| 00077 | 78 |
| 00555 | 556 |
+-------+------+
18 rows in set (0.00 sec)
MariaDB []> -- After DELETE a ROW
MariaDB []> UPDATE abc , (SELECT @nr:=0) AS INIT SET a := @nr := (@nr+1);
Query OK, 16 rows affected (0.03 sec)
Rows matched: 18 Changed: 16 Warnings: 0
MariaDB []> ALTER TABLE abc AUTO_INCREMENT=1;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB []> select * from abc;
+-------+------+
| a | b |
+-------+------+
| 00001 | 2 |
| 00002 | 3 |
| 00003 | 4 |
| 00004 | 5 |
| 00005 | 6 |
| 00006 | 7 |
| 00007 | 8 |
| 00008 | 9 |
| 00009 | 10 |
| 00010 | 11 |
| 00011 | 12 |
| 00012 | 13 |
| 00013 | 14 |
| 00014 | 15 |
| 00015 | 16 |
| 00016 | 17 |
| 00017 | 18 |
| 00018 | 19 |
+-------+------+
18 rows in set (0.00 sec)
MariaDB []> INSERT INTO abc (a) VALUES(NULL);
Query OK, 1 row affected (0.01 sec)
MariaDB []> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 19 |
+------------------+
1 row in set (0.00 sec)
MariaDB []> select * from abc;
+-------+------+
| a | b |
+-------+------+
| 00001 | 2 |
| 00002 | 3 |
| 00003 | 4 |
| 00004 | 5 |
| 00005 | 6 |
| 00006 | 7 |
| 00007 | 8 |
| 00008 | 9 |
| 00009 | 10 |
| 00010 | 11 |
| 00011 | 12 |
| 00012 | 13 |
| 00013 | 14 |
| 00014 | 15 |
| 00015 | 16 |
| 00016 | 17 |
| 00017 | 18 |
| 00018 | 19 |
| 00019 | 20 |
+-------+------+
19 rows in set (0.01 sec)
MariaDB []>