【问题标题】:CHECK constraint in SQL Server, via GUI or manually?SQL Server 中的 CHECK 约束,通过 GUI 还是手动?
【发布时间】:2013-01-29 19:56:04
【问题描述】:

我想向一个已经存在的表添加一个检查约束,该表基于 SELECT COUNT(*) 语句进行检查。我知道我的 SELECT 语句,但是当我创建 DROP AND CREATE TO 脚本时,我不确定在哪里添加我的代码以及它应该采用什么格式?

考虑到 SELECT COUNT(*),有没有办法在 GUI 中执行此操作,或者有人可以向我展示一个带有 CHECK 约束的 CREATE 表语句的示例吗?

我知道 CHECK 约束只需从这里计算为布尔值:http://msdn.microsoft.com/en-gb/library/ms188258(v=sql.105).aspx

【问题讨论】:

  • 在您链接到的文档中有一个将CHECK 约束添加到表的示例,您能否更具体地说明您不了解的内容?同一页面链接到Creating and Modifying CHECK Constraints,其中包含更多信息和示例。我怀疑你真正的困难是使用COUNT(),但你没有解释你想要达到的目标,所以很难说最好的回应是什么。

标签: sql sql-server database database-design sql-server-2012


【解决方案1】:

首先要注意的是,您不能直接在检查约束中使用子查询,但是创建一个函数是一种解决方法。这将帮助您:

CREATE FUNCTION dbo.fnRedRows()
RETURNS INT
AS
BEGIN
    DECLARE @Return INT
    SELECT @Return=COUNT(*) FROM dbo.Red
    RETURN @Return
END
GO
CREATE TABLE dbo.Red 
(
    id INT IDENTITY(1,1), 
    test VARCHAR(max), 
    CONSTRAINT CK_MaxRows CHECK (dbo.fnRedRows()<5)
)
GO
INSERT INTO dbo.Red (test) VALUES ('HI')
INSERT INTO dbo.Red (test) VALUES ('The')
INSERT INTO dbo.Red (test) VALUES ('first four')
INSERT INTO dbo.Red (test) VALUES ('will work')
INSERT INTO dbo.Red (test) VALUES ('This one will fail')
GO
DROP TABLE dbo.Red
GO
DROP FUNCTION dbo.fnRedRows
GO

【讨论】:

  • 我实际上是在尝试复制基于表的断言。但是,我知道 SQL Server 不能做断言?我对此使用检查约束是否正确?我的限制是强制执行行数。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2023-01-31
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多