如果表为空,如何插入具有递增值的条目[SQL]

问题描述

我确实有一个带有条目的Table: Example,如下所示:

Example

entryID: 0,number:1;

如果您要插入一个新条目(条目ID递增),您将执行以下操作:

INSERT INTO "Example" VALUES(SELECT MAX(entryID)+1 FROM "Example"),2);

问题:如果Example-Table为空怎么办?您如何向逻辑中添加逻辑以进行检查,如果没有,那么添加entryID = 0?

解决方法

首先,此代码不适用于任何数据库:

INSERT INTO "Example"
     VALUES (SELECT MAX(entryID)+1 FROM "Example"),2);

它缺少子查询周围的括号。这更自然地写为INSERT . . . SELECT,而不是INSERT . . . VALUES。您问题的狭义答案是COALESCE()

INSERT INTO "Example" (EntryId,Number)
     SELECT COALESCE(MAX(entryID) + 1,1),2
     FROM "Example";

请注意INSERT中的列列表。最好始终包含这些内容。

这是 narrow 答案,因为这不是获得递增ID的正确方法。您无需指定数据库,但是基本上大多数数据库都具有增量ID的语法-通常使用identityauto_incrementserialgenerated always as之类的语法。这是添加增量ID的正确方法。

为什么是正确的方法?您的方法可能会在多线程环境中导致重复,在该环境中,会同时进行两次插入。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...