2013-03-21 188 views
3

请刚刚开始学习SQL并陷入困境。我试图为我的测试项目创建一个数据库,我创建了一些表,创建了关系,定义了主键和外键......所有这些都在SQL Server 2008中通过可视化界面(表格设计/编辑) ,没有声明编码(还没有到达,但我会:))。在SQL Server 2008中检查约束条件

我有一个表中的列Tax称为Orders和我做功课,发现它是最好使用decimal数据类型(我用十进制(5,2))与CHECK约束。

所以我右单击的列 - >限制和表达我输入

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

我值超过检查约束,我可以输入123456.0999和我1234560999的表,如果键入2.5我得到25 .....所以CHECK CONSTRAINT不工作,它应该是什么?

请帮


编辑:这里是创建脚本把我的表

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 

回答

10

检查约束只是工作 - 试试这个:你什么时候

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) 

消息547,级别16,状态0,第1行
INSERT语句冲突与CHECK约束 “CK__Orders__Tax__164452B1”。冲突发生在数据库“test”,表“dbo.Orders”,列'Tax'中。

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

消息547,级别16,状态0,第1行
INSERT语句冲突与CHECK约束 “CK__Orders__Tax__164452B1”。冲突发生在数据库“test”,表“dbo.Orders”,列'Tax'中。

所以我会说 - 是检查约束IS工作就好了... ...

更新:

如果你坚持这样做硬盘的方式 - 使用(而蹩脚)可视化设计器 - 那么你需要定义检查约束的位置:

enter image description here

一旦我这样做了,然后我在SQL Server Management Studio中去Edit top 200 rows输入数据,并且我输入了违反检查约束条件的东西,我得到:

enter image description here

如果不适合你从你的客户端应用程序的工作 - 那么你极有可能与客户端应用程序问题- 而不是与SQL Server中的CHECK约束!

+0

对不起,我还没有那么熟练,知道把代码准确地放在哪里,但是当我将CONSTRAINT更改为**([Tax]> =(0.0)AND [Tax] <=(100.0))**我得到>将数值转换为数据类型数值的算术溢出错误。这是新的.... :) – Nobot 2013-03-21 13:05:12

+0

当我输入5.25或2.1或0.12它重置为525,21,12,并给出了该错误,我正在通过接口(设计/编辑),每次更改后保存。 ... :) – Nobot 2013-03-21 13:07:54

+0

对于所有人,特别是Marc_s,BIG感谢您对(我同意)CRAPPY WAY的描述,但我到了那里。我得到了像你一样定义的税务专栏,但没有发生任何重大事件。然后,我放弃了桌子,取消了所有关系,并按照您所描述的方式重新配对。现在,当我输入100.0以上时,我也会得到与CHECK约束条件冲突的错误_INSERT语句,但是当我输入2.5或17.8时,它只会将其舍入到25或178(当然有错误)。来自脚本的代码将在一个答案中跟随! – Nobot 2013-03-22 10:32:04