可以使用 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.

我不确定我是否理解为什么您认为这比外键更好,但是是的,您可以通过其他(劣等)方式实现参照完整性。这些将比正确执行和修复设计要慢。

  1. 检查约束+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;
    
  2. 触发器

    我认为需要了解更多关于架构的信息,但您可以研究一下。