如何解决SQL INSERT时因违反非空约束(NOT NULL)导致的报错?

云婷同学_3403

云婷同学_3403

2026-06-22

666人浏览

原创

必须显式赋值或完全不提该列以触发default约束;仅设default不设not null时null仍合法,设not null+default后若insert显式赋null则报错,完全不提该列才生效。

如何解决sql insert时因违反非空约束(not null)导致的报错?

报错“Cannot insert the value NULL into column 'xxx'”时,不是数据库“不讲道理”,而是你没按规则提供值——要么显式赋值,要么让 DEFAULT 约束真正生效。

INSERT 语句里漏了 NOT NULL 列名,但以为会自动填默认值

很多人写 INSERT INTO Users (id, name) VALUES (1, 'Alice'),却指望 email 列(定义为 NOT NULL DEFAULT 'unknown@example.com')自动填上默认值。实际不会生效:只要你在列名列表里没提它,SQL Server 才会触发 DEFAULT;但如果表结构里只加了 DEFAULT 没加 NOT NULL,哪怕省略该列,插入的仍是 NULL,照样报错。

  • ✅ 正确做法:完全不写该列名,且该列必须同时满足 NOT NULL + DEFAULT
  • ❌ 错误写法:INSERT INTO Users (id, name, email) VALUES (1, 'Alice', NULL) —— 显式写 NULL 直接炸
  • ⚠️ 注意:DEFAULT 值必须是常量或确定性表达式,比如 GETDATE() 可以,GETDATE() + 1 不行

ALTER TABLE 新增 NOT NULL 列时没配 DEFAULT

给已有数据的表加新列并设为 NOT NULL,SQL Server 会直接拒绝,除非你同步指定 DEFAULT。

妙刷AI
妙刷AI

妙刷AI是一款面向图片改造、风格转换和视频创作的 AI 视觉生成工具。

下载
  • ✅ 能成功:ALTER TABLE Users ADD phone VARCHAR(20) NOT NULL DEFAULT 'N/A'
  • ❌ 会报错:ALTER TABLE Users ADD phone VARCHAR(20) NOT NULL —— 错误提示明确说 “only allows columns that can contain nulls, or have a DEFAULT definition”
  • ? 加完后若要删默认约束,得先查约束名:SELECT name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('Users'),再用 ALTER TABLE Users DROP CONSTRAINT [DF_Users_phone]

SQLAlchemy / ORM 插入时报 id NOT NULL 违反

模型里写了 id = Column(INTEGER, primary_key=True, autoincrement=True),但建表 SQL 是手写的 id INTEGER NOT NULL,没用 SERIAL 或 GENERATED BY DEFAULT AS IDENTITY,就会导致 ORM 省略 id 字段插入,而数据库把它当 NULL 处理。

  • ✅ PostgreSQL 正确建表:id SERIAL NOT NULL PRIMARY KEY(或 INTEGER GENERATED BY DEFAULT AS IDENTITY)
  • ✅ 开发阶段推荐用 SQLAlchemy Base.metadata.create_all() 自动建表,避免模型和 DDL 脱节
  • ⚠️ SQLite 下常见于 SqlSugar 实体类没配 [SugarColumn(IsNullable = true)],或字段是值类型(如 int)却没设默认值

快速定位报错具体是哪一列

错误信息里已经说了,别跳过它:

  • 看完整错误:Cannot insert the value NULL into column 'status', table 'Orders'; column does not allow nulls. → 直接锁定 status 列
  • 立刻查表结构:SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Orders' AND COLUMN_NAME = 'status'
  • 确认业务逻辑:这个字段是否真不该为空?如果可以为空,就改约束;如果必须有值,就在 INSERT 里补上,或确保 DEFAULT 生效

最容易被忽略的是:DEFAULT 约束只在“完全不提该列”时才起作用,而不是“不给值”——后者在多数方言里等价于显式 NULL。别依赖直觉,查执行计划或用 SET STATISTICS XML ON 看 SQL Server 实际生成的 INSERT 语句长什么样。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3763

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

811

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

969

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5561

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2543

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5540

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7241

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

990

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

872

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习