SQL插入数据报错:主键列不允许NULL值且无法设置空属性
问题原因
CustomerID是Customers表的主键列,关系型数据库的主键有硬性规则:值不能为NULL、不能重复,作用是唯一标识表里的每一行记录。你改列属性时碰到的"null property cannot be set on a column which is part of the primary key"报错,是数据库的底层保护机制——主键从设计上就不允许为NULL,根本改不了这个属性,不是你操作步骤错了。
解决方案
根据你这张表的主键设计逻辑,选一种方式处理就行:
- 手动赋值主键:如果
CustomerID是业务侧生成的编码(比如你用的Northwind样例库里,这个字段本来就是存5位长度的客户简码),插入数据的时候必须显式给这个字段传非空、不重复的值,改完的插入语句参考:
INSERT INTO Customers (CustomerID, contactname, City, Country) VALUES ('CARD', 'Cardinal', 'Stavanger', 'Norway');
- 数据库自动生成主键:如果不想每次手动传
CustomerID,就给这个主键列配置自动生成规则,不同数据库的配置语法不一样:- SQL Server:给列加
IDENTITY(起始值,增量)属性,比如设为IDENTITY(1,1)就会从1开始,每次新增记录自动加1生成唯一ID - MySQL:给列加
AUTO_INCREMENT属性 - PostgreSQL:把列类型设为
SERIAL,或者配置GENERATED AS IDENTITY规则
配置完成后,你最开始写的那条不带CustomerID的插入语句就能正常执行,数据库会自动补全合法的主键值,不会再报空值错误。
- SQL Server:给列加
避坑提醒
别想着绕开主键的非空约束,主键要是能存NULL,就没法唯一标识单条记录,后续做多表关联、数据更新/删除的时候,很容易出现大面积数据错乱的问题。
内容的提问来源于stack exchange,提问作者Yara H
相关产品推荐
相关产品推荐

