如何知道何时创建复合约束?

时间:2019-01-11 16:44:43

标签: sql model constraints ssms

我目前正在学习SQL,并且我有一个需要在代码中实现的物理数据模型。但是,在创建约束的过程中,出现在FK和U旁边的数字极大地困扰了我。考虑。编辑:添加了完整的物理模型。

我知道,当事情是主键时,我们必须有一个PK约束,该约束将所有列标记为PK。但是,当事情是FK或唯一约束时,我不确定自己。

假设我要为表Opcao创建FK约束。

我应该为多个列创建一个约束,像这样引用它们各自的列:

ALTER TABLE MySchema.Opcao ADD CONSTRAINT [FK_SUPERKEY] FOREIGN KEY ([prova], [aluno], [pergunta], [dataRealizacao])
    REFERENCES MySchema.Integra([prova], [aluno], [pergunta], [dataRealizacao]);

或为每列创建一个约束,如下所示:

ALTER TABLE MySchema.Opcao ADD CONSTRAINT [FK_OPCAO_PROVA] FOREIGN KEY ([prova])
    REFERENCES MySchema.Integra([prova]);
ALTER TABLE MySchema.Opcao ADD CONSTRAINT [FK_OPCAO_ALUNO] FOREIGN KEY ([aluno])
    REFERENCES MySchema.Integra([aluno]);
ALTER TABLE MySchema.Opcao ADD CONSTRAINT [FK_OPCAO_PERGUNTA] FOREIGN KEY ([pergunta])
    REFERENCES MySchema.Integra([pergunta]);
ALTER TABLE MySchema.Opcao ADD CONSTRAINT [FK_OPCAO_DATAREALIZACAO] FOREIGN KEY ([dataRealizacao])
    REFERENCES MySchema.Integra([dataRealizacao]);

唯一约束是否遵循相同的逻辑?我怎么知道什么时候该做一个?

1 个答案:

答案 0 :(得分:0)

您要创建一个由三列组成的外键,这些外键必须与引用表中的所有三列都匹配? 然后,在我看来,应该对三列使用约束,因为这是您要说明的语义。 每个列方法的一个约束具有相同的效果,但是您必须花一点时间来获得意图。

其他一些技巧:我不了解架构的语义,因为我不知道实体的命名语言。如果以英语命名,会更容易。我看到的一件事是pergunta列,该列已重复并且需要在opcao,Integra和Pergunta表中保持一致,这可能会导致问题。 我通常帮助我始终为每个表(甚至是n至m关系的联接表)制作一个人为的自动增量主键,并始终引用此人为键。这样一来,您的问题就更少了(例如,不区分大小写),并且该模式在我看来更容易理解。