向含IDENTITY约束的表插入数据时遇报错,求解决方案
解决Customer表插入报错的两个问题
第一个错误:无法显式插入标识列值
问题原因
CustomerID是设置了identity(100,1)的自增主键,默认情况下IDENTITY_INSERT处于OFF状态,不允许手动指定自增列的值插入。
解决办法
有两种可选方案:
方案1:开启IDENTITY_INSERT后插入,操作完成后记得关闭(避免影响后续自增逻辑)
SET IDENTITY_INSERT Customer ON INSERT INTO Customer(CustomerID, CustomerName, contact, [Address]) VALUES (101, 'Bruce Wayne', 1212456789, '31, Wayne Manor Estate, Gotham'); SET IDENTITY_INSERT Customer OFF
方案2:不指定CustomerID,让数据库自动生成自增值(更符合自增列的设计初衷)
INSERT INTO Customer(CustomerName, contact, [Address]) VALUES ('Bruce Wayne', 1212456789, '31, Wayne Manor Estate, Gotham');
执行后数据库会自动生成下一个自增值(第一次插入是100,第二次101,以此类推)
第二个错误:算术溢出转换int类型
问题原因
你插入的contact值0012124567890(实际数值为12124567890)远超过了int类型的取值范围(int最大值为2147483647),导致类型转换时溢出。此外,电话号码通常不需要算术运算,且可能包含前导零、加号等特殊字符,用int存储本身就不合理。
解决办法
方案1:修改contact字段为bigint类型(适合纯数字且需要数值运算的场景)
ALTER TABLE Customer ALTER COLUMN contact bigint NOT NULL;
修改后执行插入语句:
-- 开启IDENTITY_INSERT的情况 SET IDENTITY_INSERT Customer ON INSERT INTO Customer(CustomerID, CustomerName, contact, [Address]) VALUES (101, 'Bruce Wayne', 12124567890, '31, Wayne Manor Estate, Gotham'); SET IDENTITY_INSERT Customer OFF -- 不指定CustomerID的情况 INSERT INTO Customer(CustomerName, contact, [Address]) VALUES ('Bruce Wayne', 12124567890, '31, Wayne Manor Estate, Gotham');
方案2:修改contact字段为varchar类型(更适合存储电话号码的场景)
ALTER TABLE Customer ALTER COLUMN contact varchar(20) NOT NULL;
修改后插入可直接保留前导零:
-- 开启IDENTITY_INSERT的情况 SET IDENTITY_INSERT Customer ON INSERT INTO Customer(CustomerID, CustomerName, contact, [Address]) VALUES (101, 'Bruce Wayne', '0012124567890', '31, Wayne Manor Estate, Gotham'); SET IDENTITY_INSERT Customer OFF -- 不指定CustomerID的情况 INSERT INTO Customer(CustomerName, contact, [Address]) VALUES ('Bruce Wayne', '0012124567890', '31, Wayne Manor Estate, Gotham');
内容的提问来源于stack exchange,提问作者sajithwi
相关产品推荐
相关产品推荐

