我有两张桌子 - EmpDetails
& ChangeLog
EmpDetails
存储员工的详细信息 - 它有ID, Name
等。
ChangeLog
用于记录对员工详细信息的更改 - 它有ID, DateOfChange, ChangeDescription
等。
我想确保ChangeLog.ID
是EmpDetails.ID
列中包含的值。
所以,我使用ChangeLog.ID
列的用户定义函数设置 CHECK 约束(UDF检查ID
中是否存在EmpDetails.ID
)
我的问题是 - 如果从ID
删除特定的EmpDetails
行,如果ID
中有ChangeLog
行,是否会引发错误?
情况似乎并非如此......我不明白为什么。
那么,我将如何获得这样的功能?我能想到的一种方法是在EmpDetails
上为删除操作创建一个触发器。
上述问题的其他解决方案?
编辑 - 我试图指定一个外键关系。但是ChangeLog中的ID不是密钥,因为ChangeLog表可以包含多个相同ID的记录(我的意思是,员工可以多次更改其详细信息,因此在ChangeLog中,相同ID的记录将超过1条)。即使在这种情况下,我是否应该能够指定外键关系?
答案 0 :(得分:3)
您所描述的是foreign key关系。执行它:
ALTER TABLE ChangeLog
ADD CONSTRAINT FK_EmpDetailsId FOREIGN KEY (ID)
REFERENCES EmpDetails (ID);
然后,SQL Server将为您维护关系,而不需要您的UDF。如果EmpDetails中的相应行不存在,则插入到ChangeLog将失败,如果ChangeLog中存在匹配的行,则从EmpDetails中删除将失败。
答案 1 :(得分:1)
ChangeLog表上的检查约束,而不是EmpDetails上的检查约束,因此当您修改EmpDetails时,它不会被检查。 SQL服务器不够智能,无法确定在更改其他表时要运行检查。
但是,如果您只想确保EmpDetails表中有一行,为什么不使用简单的参照完整性规则(例如外键)?