sql-server-2008 - SQL Server 2008 中的检查约束

标签 sql-server-2008 check-constraints

拜托,我刚开始学习 SQL 并卡住了。我正在尝试为我的测试项目构建一个数据库,我已经创建了一些表,做了关系,定义了主键和外键.....所有这些都在 SQL Server 2008 中通过可视界面(表设计/编辑) ,没有语句编码(还没有到那里,但我会的:))。

我在一个名为 Orders 的表中有一个列 Tax,我做了功课,发现最好使用 decimal 数据类型(我使用了带 CHECK 约束的小数(5, 2))。

所以我右键单击列 -> 约束并在表达式中输入

([TAX] >= (0.00) AND [TAX] <= (100.00))

我的值超出了检查约束,我可以输入 123456.0999,然后在表中得到 1234560999,如果我输入 2.5,我得到 25..... 所以 CHECK CONSTRAINT 不起作用它应该???

请帮忙


编辑:这是我 table 上的创建脚本

    USE [MyCompany]
GO

/****** Object:  Table [dbo].[Orders]    Script Date: 03/22/2013 11:33:24 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Orders](
    [OrderID] [int] IDENTITY(1,1) NOT NULL,
    [OrderDateTime] [smalldatetime] NOT NULL,
    [CustomerID] [int] NOT NULL,
    [Tax] [decimal](5, 2) NULL,
    [Shipping] [decimal](7, 3) NOT NULL,
 CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
(
    [OrderID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Orders]  WITH CHECK ADD  CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([CustomerID])
REFERENCES [dbo].[Customers] ([CustomerID])
GO

ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Customers]
GO

ALTER TABLE [dbo].[Orders]  WITH CHECK ADD  CONSTRAINT [CK_Orders_Tax] CHECK  (([Tax]>=(0.0) AND [Tax]<=(100.0)))
GO

ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [CK_Orders_Tax]
GO

最佳答案

检查约束正常工作 - 试试这个:

CREATE TABLE Orders (OrderID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
                     TotalAmount DECIMAL(18,2),
                     Tax DECIMAL(5,2) CHECK (Tax >= 0.0 AND Tax <= 100.0)
                    )

现在当您尝试插入数据时:

INSERT INTO dbo.Orders(TotalAmount, Tax)
VALUES (100.0, 2.75)     --> works just fine

INSERT INTO dbo.Orders(TotalAmount, Tax)
VALUES (200.0, 15.75)   --> works just fine

INSERT INTO dbo.Orders(TotalAmount, Tax)
VALUES (300.0, -2.0)

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK__Orders__Tax__164452B1". The conflict occurred in database "test", table "dbo.Orders", column 'Tax'.

INSERT INTO dbo.Orders(TotalAmount, Tax)
VALUES (400.0, 200.75)

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK__Orders__Tax__164452B1". The conflict occurred in database "test", table "dbo.Orders", column 'Tax'.

所以我想说 - 检查约束 IS 工作得很好......

更新:

如果您坚持以艰难的方式执行此操作 - 使用(相当糟糕的)视觉设​​计器 - 那么您需要在此处定义检查约束:

enter image description here

一旦我这样做了,然后我去 SQL Server Management Studio 中的 Edit top 200 rows 输入数据,我输入了违反检查约束的内容,我得到:

enter image description here

如果这对您的客户端应用程序不起作用 - 那么您很可能遇到客户端应用程序的问题 - 而不是 SQL 中的 CHECK 约束服务器!

关于sql-server-2008 - SQL Server 2008 中的检查约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15546169/

相关文章:

sql - 数字上的sql server中的子字符串

sql - 主键和代理键有什么区别?

sql - 查看以识别分组值或对象

sql - 检查确保 tableA 列中的值小于 tableB 列中的值的约束

c# - 使用 Linq-to-SQL 添加多条记录

sql-server - 如何查找包含 <text> 的存储过程?

SqLite.js 未捕获错误 : CHECK constraint failed

sql - 如何创建在 Postgres 中创建表的 IF 语句?

database - 未完全指定的日期常量

sql - 检查外键约束 "online"