Sql server 另一张桌子上没有at。哦,天哪……我刚刚意识到你在做什么。你的设计肯定有一个大问题。现在的方式意味着SpellSource中的相同值必须同时存在于类和子类表中。我不太确定你在这里建模的是什么,但有些地方似乎有点不对劲。SpellSource中的值怎么能同时

Sql server 另一张桌子上没有at。哦,天哪……我刚刚意识到你在做什么。你的设计肯定有一个大问题。现在的方式意味着SpellSource中的相同值必须同时存在于类和子类表中。我不太确定你在这里建模的是什么,但有些地方似乎有点不对劲。SpellSource中的值怎么能同时,sql-server,foreign-keys,Sql Server,Foreign Keys,另一张桌子上没有at。哦,天哪……我刚刚意识到你在做什么。你的设计肯定有一个大问题。现在的方式意味着SpellSource中的相同值必须同时存在于类和子类表中。我不太确定你在这里建模的是什么,但有些地方似乎有点不对劲。SpellSource中的值怎么能同时引用一个类和一个子类呢?听起来您需要重新检查您的模式设计,或者使用触发器而不是约束来处理此非标准设计。谢谢您的评论。我试图使用“SpellSource”列作为一个全面的参考,以引用几个不同的表。根据到目前为止的信息,我想这是不可能的?我猜Spe


另一张桌子上没有at。哦,天哪……我刚刚意识到你在做什么。你的设计肯定有一个大问题。现在的方式意味着SpellSource中的相同值必须同时存在于类和子类表中。我不太确定你在这里建模的是什么,但有些地方似乎有点不对劲。SpellSource中的值怎么能同时引用一个类和一个子类呢?听起来您需要重新检查您的模式设计,或者使用触发器而不是约束来处理此非标准设计。谢谢您的评论。我试图使用“SpellSource”列作为一个全面的参考,以引用几个不同的表。根据到目前为止的信息,我想这是不可能的?我猜SpellSource可以是一个类或子类。在这种情况下,您可以创建一个引用整个类的子类,只需为子类创建一个外键。如果需要更多的源表,您可能需要更大的重新设计。此解决方案的唯一问题是,在设计此数据库时,我试图将SpellSource设置为同时接受ClassName和SubclassName,因为有些拼写只对应于类,子类也是如此。然后您需要三列SPELL_SOURCE(SpellID、SubclassID、ClassID),它们都是PK和FK。在我的设计中,我假设一个子类只能属于一个类,也就是说,您有一个严格的类/子类层次结构(名称所示)。然后通过一个子类间接地为拼写源分配一个类;事实就是这样。每个子类必须属于1个且仅属于1个类。然而,我试图使子类名或类名成为拼写的“来源”。如果是这样,这个解决方案会更容易解决吗?此外,法术可以属于多个不同的类别和子类别。我的印象是PK不能为空。只有一个PK的表才是这种情况吗?@RyanGress&OlivierJacot Descombes提供了关于什么是不需要的超类的子类的数据,因为这不会改变。看我对这个问题的评论,你是对的。但据我所知,@RyanGress也希望能够将一个类分配给一个咒语,而无需在咒语没有那么具体的情况下将其分配给子类。(起初我也不明白。)
CREATE TABLE SPELL_SOURCE (
    SpellName       VarChar(50)     NOT NULL,
    SpellSource     Char(25)        NOT NULL,
    CONSTRAINT      SpellSourcePK1  PRIMARY KEY (SpellName, SpellSource),
    CONSTRAINT      SpellSourceFK   FOREIGN KEY (SpellName)
                        REFERENCES SPELLS(SpellName)
                            ON UPDATE NO ACTION
                            ON DELETE NO ACTION,
    CONSTRAINT      SpellSourceFK1  FOREIGN KEY (SpellSource)
                        REFERENCES CLASS(ClassName)
                            ON UPDATE NO ACTION
                            ON DELETE NO ACTION,
    CONSTRAINT      SpellSourceFK2  FOREIGN KEY (SpellSource)
                        REFERENCES SUBCLASS(SubclassName)
                            ON UPDATE NO ACTION
                            ON DELETE NO ACTION
);
SELECT
    S.SubclassID,
    CASE WHEN S.SubclassName IS NULL THEN
        'CLASS: ' + C.ClassName
    ELSE
        S.SubclassName + ' (' + C.ClassName + ')'
    END AS Name
FROM
    CLASS C
    INNER JOIN SUBCLASS S
        ON C.ClassID = S.ClassID
ORDER BY
    C.ClassName, 
    CASE WHEN S.SubclassName IS NULL THEN 0 ELSE 1 END,
    S.SubclassName