在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]
答案 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
无需代码或触发器即可完全正常工作
编辑:根据Damien_The_Unbeliever的回答
第二种方法,OK,触发
第三种方式,不太好,使用功能
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 )