SQL Server column not allow Null,insert failed

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

这个是一个Vendor的应用程序报的错误。,单看这个错误原因很简单,尝试将NULL值插入到表,但是表不允许使用NULL值。

 

查到后面发现其实根本原因是字段的内容没有按照当时的规定。按照要求,用户输入的需要包含’-’,但是用户输入的数据没有这个字符,系统尝试用”-”分隔数据的时候出现问题。

 

其实这个是应用程序设计的问题,在用户输入的时候根据规则验证用户的输入,确保所有的数据都是合理的,这样可以避免后续的问题。(如果不做验证的话,除了业务逻辑的问题,还可能会导致SQL注入的问题)。

 

解决思路:除了在应用端做验证,也可以用SQLServer Constraint

 

下面举个例子:

 

createtable test(namevarchar(10))

 

altertable testaddconstraintck_nameCHECK(charindex('-',name)>0)

 

如果我尝试插入没有”-”字符的数据会出现下面的错误:

 

insertinto testvalues ('4')

 

Msg 547, Level16, State 0, Line 1

The INSERTstatement conflicted with the CHECK constraint "ck_name". Theconflict occurred in database "master", table "dbo.test",column 'name'.

The statement has beenterminated.



 

有一点要注意保持事物的完整性,如果一次插入多条记录,不用显示事物的话可能会出现有些插入成功,有些失败的情况。为了保持完整性,可以用显事物:

 

begintry

begintran

insertinto test values ('1-')

insertinto test values ('2-')

insertinto test values ('3-')

insertinto test values ('4')

insertinto test values ('5-')

committran

endtry

begincatch

rollbacktran

endcatch

 

这样如果有一条记录有问题就会回滚整个事务。Constraint还可以限制唯一值,外键,用正则表达式等,功能非常强大,数据输入的时候做好验证,可以避免后续很多的维护问题。

 


本文转自 lzf328 51CTO博客,原文链接:


http://blog.51cto.com/lzf328/1351662

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
4月前
|
SQL Oracle 关系型数据库
SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语
SELECT INTO 语句将数据从一个表复制到一个新表中。
62 1
|
4月前
|
SQL 数据库
SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用
NULL 值是指字段没有值的情况。如果表中的字段是可选的,那么可以插入新记录或更新记录而不向该字段添加值。此时,该字段将保存为 NULL 值。需要注意的是,NULL 值与零值或包含空格的字段不同。具有 NULL 值的字段是在记录创建期间留空的字段。
57 0
|
4月前
|
SQL 关系型数据库 MySQL
我使用flinkcdc的sql形式进行全量同步,4张表,有两张表数据没进去,看日志,id怎么是null呢?
我使用flinkcdc的sql形式进行全量同步,4张表,有两张表数据没进去,看日志,id怎么是null呢?
117 40
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
51 0
|
1月前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
|
28天前
|
SQL 关系型数据库 MySQL
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
14 0
|
4月前
|
SQL 数据库
SQL INSERT INTO 语句详解:插入新记录、多行插入和自增字段
SQL INSERT INTO 语句用于在表中插入新记录。
206 0
|
9月前
|
SQL Oracle 关系型数据库
【问题处理】—— SQL里进行 null值 的判断永远返回 false?
【问题处理】—— SQL里进行 null值 的判断永远返回 false?
60 0
|
9月前
|
SQL 数据库
SQL中字段跟子查询结果判等,子查询结果为null的处理办法
前言:今天写功能的时候遇到一个问题,SQL中字段跟子查询结果判等,子查询结果为null,查询不到数据
|
5月前
|
安全 关系型数据库 MySQL
java.sql.SQLException: null,message server: Host ora-rac2 is blocked because of many
java.sql.SQLException: null,message server: Host ora-rac2 is blocked because of many