可以使用 alter table 强制执行参照完整性吗?
Can referential integrity be enforced using alter table?
有没有办法在没有外键的情况下强制参照完整性?有没有办法通过 alter table 语句实现我在下面尝试做的事情?
ALTER TABLE no.Man
WITH CHECK ADD CONSTRAINT chk_Son_Weight CHECK
(Son_Weight IN (Select distinct Weight from no.Man))
GO
我使用上面的代码得到了以下错误
Subqueries are not allowed in this context. Only scalar expressions are allowed.
我不确定我是否理解为什么您认为这比外键更好,但是是的,您可以通过其他(劣等)方式实现参照完整性。这些将比正确执行和修复设计要慢。
检查约束+UDF
CREATE FUNCTION dbo.IsItAValidWeight(@Son_Weight int)
RETURNS bit
WITH SCHEMABINDING
AS
BEGIN
RETURN
(
SELECT CASE WHEN EXISTS
(
SELECT 1
FROM no.Man WHERE Weight = @Son_Weight
) THEN 1 ELSE 0 END
);
END
GO
ALTER TABLE no.Man WITH CHECK
ADD CONSTRAINT chk_Son_Weight
CHECK dbo.IsItAValidWeight(Son_Weight) = 1;
触发器
我认为需要了解更多关于架构的信息,但您可以研究一下。
有没有办法在没有外键的情况下强制参照完整性?有没有办法通过 alter table 语句实现我在下面尝试做的事情?
ALTER TABLE no.Man
WITH CHECK ADD CONSTRAINT chk_Son_Weight CHECK
(Son_Weight IN (Select distinct Weight from no.Man))
GO
我使用上面的代码得到了以下错误
Subqueries are not allowed in this context. Only scalar expressions are allowed.
我不确定我是否理解为什么您认为这比外键更好,但是是的,您可以通过其他(劣等)方式实现参照完整性。这些将比正确执行和修复设计要慢。
检查约束+UDF
CREATE FUNCTION dbo.IsItAValidWeight(@Son_Weight int) RETURNS bit WITH SCHEMABINDING AS BEGIN RETURN ( SELECT CASE WHEN EXISTS ( SELECT 1 FROM no.Man WHERE Weight = @Son_Weight ) THEN 1 ELSE 0 END ); END GO ALTER TABLE no.Man WITH CHECK ADD CONSTRAINT chk_Son_Weight CHECK dbo.IsItAValidWeight(Son_Weight) = 1;
触发器
我认为需要了解更多关于架构的信息,但您可以研究一下。