如何防止一个用户拥有相同的值

时间:2019-08-28 15:00:16

标签: sql sql-server

我有这种桌子:

https://ibb.co/sPn5zT7

UserPl表中,ProgrammingLanguageIdKnowledgeId是外键,与KnowledgeProgrammingLanguage表的主键相连。

例如,我想插入

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

我该如何实现?

4 个答案:

答案 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

上面的查询将解决您的问题。如果您想知道它是如何工作的,下面是一个简单的说明:

  1. 查询将首先检查UserId。 UserId是否已注册到数据库?
  2. 接下来,查询还将检查,所选用户的数据库中是否还将存在要插入数据库(ProgrammingLanguageId)的数据?
  3. 如果已经注册了UserId,并且UserId具有与将插入数据库的ID相同的ProgrammingLanguageId,它将忽略该插入并显示“数据已存在!插入将被忽略”
  4. 但是如果 UserId已在数据库中注册,但是没有与将要插入的数据匹配的ProgrammingLanguageId,它将开始插入数据

为了更好地使用,我认为您应该创建一个触发器,该触发器将在执行插入时发生。