SQL Server 2008 中的检查约束

2024-01-21

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

我有一个专栏Tax在一个名为Orders我做了功课,发现最好使用decimal数据类型(我使用decimal(5, 2))和CHECK约束。

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

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

我的值超出了检查约束,我可以输入 123456.0999,然后在表中得到 1234560999,如果我输入 2.5,我会得到 25..... 所以检查约束没有发挥应有的作用???

请帮忙


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

    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)

消息 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工作得很好...

Update:

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

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

如果这对您的客户端应用程序不起作用 - 那么您很可能遇到了问题与客户端应用程序- 并且不与CHECKSQL Server 中的约束!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2008 中的检查约束 的相关文章

  • 如何从 SQL Server 的表中获取列名?

    我想查询一个表的所有列的名称 我发现如何做到这一点 Oracle https stackoverflow com q 452464 419956 MySQL https stackoverflow com q 193780 419956 P
  • 删除 DB 但不删除 *.mdf / *.ldf

    我正在尝试自动化分离和删除数据库的过程 通过 VBS objshell run 如果我手动使用 SSMS 分离和删除我可以将数据库文件复制到另一个位置 但是如果我使用 sqlcmd U sa P MyPassword S local Q A
  • SQL Server 2008 XPath

    我们尝试根据我们提供的值过滤一组 XML 我们的数据库的 XML 字段中有以下 XML 如果传递数字 5052095050830 我们需要在 XML 中找到这个特定节点 我们提供的号码可能存在任意多次 任何机构都可以提供一些 SQL 示例来
  • 数据库不存在。确保名称输入正确

    为什么我会出现这个错误 如果您查看屏幕截图 您将看到数据库 仅当我连接到两个数据库引擎时才会发生这种情况 它仅检测下面数据库引擎中的数据库 而不检测突出显示的数据库 除了关闭应用程序并仅打开一个数据库引擎之外 还有其他方法可以使用我的数据库
  • Visual Studio 2012 - 数据库发布向导已停止?

    我正在使用 VS 2012 和 SQL Server 2008 刚刚注意到服务器资源管理器中缺少 发布到提供商 选项 据此 数据库发布向导已停止使用 http forums asp net post 5122271 aspx http fo
  • 获取一组记录之间的时间差

    我有一个具有以下结构的表 ID ActivityTime Status 19 2013 08 23 14 52 1 19 2013 08 23 14 50 1 19 2013 08 23 14 45 2 19 2013 08 23 14 3
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • SQL Server Like 查询不区分大小写

    Query SELECT from Table 2 WHERE name like Joe Output 1 100 Joe 2 200 JOE 3 300 jOE 4 400 joe 为什么不区分大小写 Problem 查询不区分大小写
  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • SqlCommand.Dispose() 在 SqlTransaction.Commit() 之前?

    在提交事务之前处理分配给事务的命令是否有效 我自己测试了以下代码 它似乎工作得很好 但这是一个相当小的例子 所以我正在寻找是否有人确实知道的确认 internal static void TestTransaction try Progra
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资
  • ssas维度处理键未找到错误

    我有一个奇怪的情况 我正在尝试处理维度 数据源是 MSSQL 当我尝试处理这个维度时 我收到此错误 OLAP存储引擎中的错误 处理时找不到属性键 表 application 列 Full Name 值 Mr Peter McDonald 该
  • T-SQL 将集合分组到单个列中,没有 NULL 重复项

    一个同义词库数据库 其中术语和类别相互链接并运行 SQL Server 2008 基于this https stackoverflow com questions 4301074 t sql select combine multiple
  • SQL 查询 - 将查询中的日期格式更改为 DD/MM/YYYY

    我想要实现的目标相当简单 将一种日期格式转换为另一种日期格式 由此 Jan 30 2013 12 00 00 000AM对此 DD MM YYYY或者在这种情况下30 01 2013 但是 当它是该月的 1 号到 9 号时 日期格式缺少零并
  • WHERE 子句中的可选参数[重复]

    这个问题在这里已经有答案了 假设有一个具有 3 个参数的存储过程 在所有可能性中 我希望通过一个单一的方法来实现这一目标WHERE子句不会失去对 using 的控制 AND OR 太多了 Example Params CITY VARCHA
  • 没有特定表的MSSQL数据库备份

    我需要在 sql 中没有特定表的情况下进行计划备份 因为如果我对该表进行备份 将需要很长时间 我需要从备份中排除一张表 是否可以 如果没有该表 所有表和数据都应该位于数据库中 除了 PRIMARY 文件组之外 您还可以为该表设置一个单独的文
  • 如果外键不存在,则添加外键约束(或者如果存在则删除外键约束)而不使用名称?

    我发现创建查询很困难 假设我有一个产品和品牌表 我可以使用此命令添加外键 ALTER TABLE Products ADD FOREIGN KEY BrandID REFERENCES Brands ID 但我只需要在外键不存在时运行此命令
  • SQL Server PIVOT 函数

    我有一个检索所有代理及其模块的查询 结果集将每个模块返回 1 行 SELECT am agentID AS agentid pa agentDisplayName agentdisplayname m ModuleName ModuleNa
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如

随机推荐