You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Microsoft SQL的int类型列仅接受非负值?

嘿,要让SQL Server里的EmployeeSalary列只接受非负值,有几种简单又靠谱的办法,我给你详细说说最常用的两种:

方法1:使用CHECK约束(首推方案)

这是SQL标准定义的约束方式,直接给列加上规则,确保输入的值≥0,维护起来也清晰直观。

新建表时直接添加约束

如果是刚创建表,你可以把约束直接写在列定义后面,或者给约束单独命名(推荐后者,方便后续排查、修改约束):

-- 简洁写法
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    EmployeeName VARCHAR(50) NOT NULL,
    EmployeeSalary INT CHECK (EmployeeSalary >= 0)
);

-- 带约束名称的写法(更易维护)
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    EmployeeName VARCHAR(50) NOT NULL,
    EmployeeSalary INT NOT NULL,
    CONSTRAINT CK_Employees_EmployeeSalary_NonNegative 
        CHECK (EmployeeSalary >= 0)
);

给已存在的表追加约束

要是表已经建好了也不用慌,用ALTER TABLE语句就能补上这个约束:

ALTER TABLE Employees
ADD CONSTRAINT CK_Employees_EmployeeSalary_NonNegative 
    CHECK (EmployeeSalary >= 0);

当有人尝试插入或更新负数到这个列时,SQL Server会直接抛出错误,阻止非法操作,比如你会看到类似这样的提示:

消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"CK_Employees_EmployeeSalary_NonNegative"冲突。该冲突发生于数据库"YourDB",表"dbo.Employees", column 'EmployeeSalary'。
语句已终止。

方法2:数据类型替代(适合金额场景)

如果你的EmployeeSalary是金额类字段,也可以考虑用SMALLMONEY或MONEY数据类型——它们的取值范围天然包含非负值(SMALLMONEY范围0到214,748.3647,MONEY范围0到922,337,203,685,477.5807)。不过如果业务要求必须用INT类型,那CHECK约束还是最直接的解决方案。

内容的提问来源于stack exchange,提问作者G. Soós

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:19:16