是否可以将自动增量主键值更新为mysql表的空值

时间:2016-02-26 13:27:52

标签: mysql c

这是我的表,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,以便在插入新值时所有值保持顺序)。

4 个答案:

答案 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 []>