3

お願いします、私は SQL を学び始めたばかりで行き詰まってしまいました。テスト プロジェクト用のデータベースを構築しようとしています。いくつかのテーブルを作成し、リレーションを作成し、主キーと外部キーを定義しました。これらはすべて SQL Server 2008 でビジュアル インターフェイス (テーブルの設計/編集) を介して行いました。 、ステートメントコーディングはありません(まだそこに到達していませんが、私はします:))。

Taxと呼ばれるテーブルに列がOrdersあり、宿題をしたところ、制約付きのdecimalデータ型 (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
4

1 に答える 1

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」で競合が発生しました。

だから私は言うだろう - そのチェック制約はうまく機能している...

アップデート:

これを難しい方法で行うことを主張する場合 - (かなりくだらない) ビジュアル デザイナーを使用する場合 - ここでチェック制約を定義する必要があります。

ここに画像の説明を入力

それを行ってからEdit top 200 rows、SQL Server Management Studio に移動してデータを入力し、チェック制約に違反するものを入力すると、次のようになります。

ここに画像の説明を入力

クライアント アプリケーションからそれがうまくいかない場合は、SQL Serverの制約ではなく、クライアント アプリに問題がある可能性が高いです。CHECK

于 2013-03-21T12:46:11.427 に答える