我可以使用SELECT语句来定义CHECK约束吗?

时间:2011-01-05 06:58:51

标签: sql-server database constants

在MS SQL服务器中,我可以使用SELECT语句来定义CHECK约束吗?假设在理想情况下我必须使用两个表“Customer Master”和“Indian Customer”,两个表都完全不同,并且无论如何都不相互关联。但他们共享相同的数据库

Content of "Customer Master":
CustomerName (colomn): a, b, c, d, e
Branchlocation (colomn): IN, AU, IN, IN, UK

Content of "Indian Customer":
customerID (colomn): 1, 2, 3
CustomerName  (colomn): a, c, d
customer details (colomn): details1, details, details
.
.
.

在表格“印度客户”中,我想设置一个约束,以便在此表中输入数据的用户不能进入“客户主数据”中不存在或其分支位置不是IN的客户。表格也在同一个项目中,但不直接相关。换句话说,你可以说只有来自“客户大师”的印度客户应该在“印度客户”表中。

select CustomerName from "Customer Master"
where Branchlocation = 'IN'

上述查询的输出只允许在[“Indian Customer”]中使用。[CustomerName]

3 个答案:

答案 0 :(得分:5)

您可以添加一些额外的约束和超级密钥,并获得您想要的内容:

CREATE TABLE CustomerMaster (
     CustomerName varchar(100) not null,
     LocationCode char(2) not null,
     constraint PK_CustomerMaster PRIMARY KEY (CustomerName),
     constraint UQ_CustomerMaster_Location UNIQUE (CustomerName,LocationCode), /* <-- Superkey here */
     constraint CK_CustomerMaster_Locations CHECK (
         LocationCode in ('IN','UK','AU')
)

CREATE TABLE IndianCustomer (
     CustomerID int not null,
     CustomerName varchar(100) not null,
     CustomerDetails varchar(max) not null,
     LocationCode as 'IN' persisted,
     constraint FK_IndianCustomer_CustomerMaster FOREIGN KEY (CustomerName,LocationCode) references CustomerMaster (CustomerName,LocationCode)
)

通过将LocationCode作为IndianCustomer中的计算列,并使用反对超级键的外键,您可以确保数据匹配。

您可以为CustomerName定义额外的FK约束 - &gt;客户名称,在某些情况下可以证明是有用的。


或者,换句话说 - 有一个,高度风格化的方式来构建基于“select”语句的约束 - 这是一个FOREIGN KEY。但有时您必须添加其他信息(例如超级密钥,计算列)以满足其他过滤要求。

答案 1 :(得分:1)

通常有3种方式

第一种方式,最好,使用DRI

  • 在“Indian Customer”中定义一个额外的列Branchlocation
  • 添加CHECK CONSTRAINT以将其限制为“IN”
  • 为CustomerName / ID,Branchlocation
  • 添加“Customer Master”的唯一约束
  • 客户名称/ ID,从“印度客户”到“客户主人”的分行位置的外键

无需代码或触发器即可完全正常工作

编辑:根据Damien_The_Unbeliever的回答

第二种方法,OK,触发

  • 在插入或更新“印度客户”时,请查看“客户主管”

第三种方式,不太好,使用功能

  • “印度客户”的检查约束使用隐藏SELECT的功能

This is not safe for concurrency and is not guaranteed to work

答案 2 :(得分:0)

注意: - 据我所知,没有办法使用select语句检查约束。但是对于您的情况,您可以使用带有where子句的简单选择查询,如下所示

select * from A 
where somecolumn not in 
( select somecolumn from B where <condition for B> )

对于您的查询,假设您在B中使用sno作为外键 -

select somedata from A
where someforeignKey = ( select sno from B where sno = 55 )