我有这种桌子:
在UserPl
表中,ProgrammingLanguageId
和KnowledgeId
是外键,与Knowledge
和ProgrammingLanguage
表的主键相连。
例如,我想插入
insert into userPLs values(1,'a7ac3486-e852-42c0-a458-9075eb5ed7d7','Doe',1,1)
在这里,Doe说他具有基本的C#知识。我想防止在Doe的下一次插入中再次出现这样的情况:
insert into userPLs values(1,'a7ac3486-e852-42c0-a458-9075eb5ed7d7','Doe',1,2)
或
insert into userPLs values(2,'a7ac3486-e852-42c0-a458-9075eb5ed7d7','Doe',1,2)
因为他曾经说过,他对C#的知识是基础的。
我正在使用MS SQL Server
我该如何实现?
答案 0 :(得分:0)
您可以防止插入带有约束。
alter table UserPl
add constraint UserLanguageSkillLevel
unique (UserId, ProgrammingLanguageId);
您仍然可以捕获失败的插入内容或修改前端,从而消除了首先添加矛盾信息的机会。
唯一性约束最终由索引强制执行。如果直接创建唯一索引而不是使用约束,则还可以应用ignore_dup_key
索引设置,并让引擎以静默方式丢弃错误的插入内容。我不赞成将其作为一种理想的方法,但它可能是暂时的权宜之计。
答案 1 :(得分:0)
尝试在需要时设置唯一索引
答案 2 :(得分:0)
表table
上有Primary key
/ Cluster Index
会强制执行您需求的任何组合,即
UserPl
Create clustered index CLU_UserPL on UserPl (UserID)
Create clustered index CLU_UserPL on UserPl (UserID, ProgrammingLanguageID)
答案 3 :(得分:0)
这可以通过使用UNIQUE约束来实现。
这是有关UNIQUE约束W3School UNIQUE Article
简单的话,UNIQUE是一个约束,它将确保所选字段中不允许使用相同的值。
如果您想使用另一种方法来阻止Doe在表中插入新值,则可以使用 IF EXISTS
def main():
data = {'a':[1, 2, 3], 'b':[4, 5, 6]}
collapse_values(data)
print(data == {'a': 6, 'b': 15})
data = {'h':[1, 1, 1, 1, 1], 'e':[1, 1, 1, 1, 1], 'l':[2, 2, 2, 2, 2], 'o':[1, 1, 1, 1, 1]}
collapse_values(data)
print(data == {'h': 5, 'e': 5, 'l': 10, 'o':5})
def collapse_values(dict1):
for value in dict1.values():
value_sum = sum(value)
if value_sum not in dict1:
dict1[value] = value
return dict1
main()
更新后的答案
这是带有IF EXISTS但具有其他条件的修改后的SQL查询。
IF EXISTS (SELECT * FROM userPLs WHERE UserId = 'THE USER ID')
BEGIN
PRINT 'Data Already Exists! Insert will be ignored!'
END
ELSE
BEGIN
PRINT 'Data doesn''t exists! Proceeding to insert the data!'
//Start inserting the data
END
上面的查询将解决您的问题。如果您想知道它是如何工作的,下面是一个简单的说明:
为了更好地使用,我认为您应该创建一个触发器,该触发器将在执行插入时发生。