如何向空表插入带自增ID的行?解决自增字段赋值报错问题
解决空表插入自增UID的报错问题
首先,你遇到的无法对null值执行+1操作的问题,根源是空表时MAX([TABLE_UID])返回的是NULL,而NULL + 1在SQL里是不合法的。咱们先搞定这个紧急问题,再彻底解决自增字段的配置难题。
临时修复:处理空表时的NULL值
可以用COALESCE函数(大多数主流数据库都支持)把NULL替换成0,这样0+1就能得到第一个UID值1了。修改后的插入语句如下:
cmdEx.ExecuteNonQuery("INSERT INTO [TABLE_NAME]([TABLE_UID], KIP_UID, NEXT_DATE, STUT_UID, CS_DATE, CE_DATE, S_M, PG_A) VALUES ((SELECT COALESCE(MAX([TABLE_UID]), 0) + 1 FROM [TABLE_NAME]), '127', '2009-06-15T13:45:30', '0', '2009-06-15T13:45:30','2010-06-15T13:45:30', 'boom', 0 )");
如果你的数据库是Microsoft Access,COALESCE可能不生效,可以换成IIF+ISNULL的组合:
cmdEx.ExecuteNonQuery("INSERT INTO [TABLE_NAME]([TABLE_UID], KIP_UID, NEXT_DATE, STUT_UID, CS_DATE, CE_DATE, S_M, PG_A) VALUES ((SELECT IIF(ISNULL(MAX([TABLE_UID])), 0, MAX([TABLE_UID])) + 1 FROM [TABLE_NAME]), '127', '2009-06-15T13:45:30', '0', '2009-06-15T13:45:30','2010-06-15T13:45:30', 'boom', 0 )");
彻底解决:正确配置自增字段
你尝试添加INT NOT NULL AUTO_INCREMENT提示语法无效,是因为不同数据库的自增语法差异很大,得对应你的数据库类型来配置:
- MySQL/MariaDB:需要把
[TABLE_UID]设为自增主键,执行这条SQL修改表结构:
配置好后,插入数据时完全不需要指定ALTER TABLE [TABLE_NAME] MODIFY COLUMN [TABLE_UID] INT NOT NULL AUTO_INCREMENT PRIMARY KEY;[TABLE_UID]字段,数据库会自动生成唯一的自增值:cmdEx.ExecuteNonQuery("INSERT INTO [TABLE_NAME](KIP_UID, NEXT_DATE, STUT_UID, CS_DATE, CE_DATE, S_M, PG_A) VALUES ('127', '2009-06-15T13:45:30', '0', '2009-06-15T13:45:30','2010-06-15T13:45:30', 'boom', 0 )"); - Microsoft Access:字段类型要设为
AutoNumber,对应SQL语法是:
同样,插入时不用手动指定该字段。ALTER TABLE [TABLE_NAME] ALTER COLUMN [TABLE_UID] AUTOINCREMENT; - SQL Server:用
IDENTITY属性实现自增:
插入数据时忽略该字段即可。ALTER TABLE [TABLE_NAME] ALTER COLUMN [TABLE_UID] INT IDENTITY(1,1) PRIMARY KEY;
这种配置原生自增字段的方式,比手动计算MAX值更可靠,还能避免多用户并发插入时出现重复UID的问题。
内容的提问来源于stack exchange,提问作者Joe Joe Joe
相关产品推荐
相关产品推荐

