2013-03-21 68 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