我对主键如何工作有点困惑,或者换句话说,如何有效地识别每个记录和受赠者没有重复。例如,为一个用户提供唯一的UserID
。无论如何这将保证表格不会接受输入与先前用户已有的名字和姓氏相同的新用户?
答案 0 :(得分:3)
拥有唯一的UserId不会阻止具有非唯一名字/姓氏的新条目。如果您希望这些列是唯一的,则需要对这些列设置唯一约束。它们与UserId列无关。
在名称列上放置唯一约束将是一个糟糕的选择。那里有很多Jon Smith
。
使用UserId可以识别每一行。例如:
id Fname Lname
---------------------
1 Jon Smith
2 Jon Smith
3 Abe Miessler
如果您尝试插入ID为1,2或3 的新记录,则会违反唯一约束,并会看到错误。
答案 1 :(得分:1)
如果您受到整个“自然键”的约束,您可以使用电子邮件地址。如果你想进入那个论点,欢迎你,并且每一方都有很多支持性的论点。我个人觉得你应该只有数据密钥,因为我喜欢直接使用数据。因此,我设计的表格看起来像:
Uid UserName Fname Lname
---------------------------------------------
1 JSmith Jon Smith
2 Jsmty John Smith
3 JSmythe Jon Smith
4 Jabetede Jon Smith
在Uid和UserName上强制使用唯一约束。
答案 2 :(得分:1)
我想用更简单的术语来澄清这一点。
For example, one user is given a unique UserID. How this in anyway will guarantee that the table will not accept the a new user that enters a first and last name that are similar to what an earlier user already have?
设置表时,可以创建一个UserID列,如下所示:
UserID INT NotNull Identity(1,1)
标识的第一个参数是初始起始编号,第二个参数是每次要增加的数量。你可以做身份(100,10),然后在100开始,每次增加10。
设置主键:
PRIMARY KEY (UserID)
当您执行插入操作时,您永远不会包含UserID
列,因为它会自动生成:
Insert into names (firstname, lastname) VALUES (@firstname, @Lastname)
现在你可以拥有42个Bob Smiths,但每个人都有自己独特的价值。
如果问题是他或她不能注册,那么UserID根本不会帮助你。你可以:
1)查询数据库并向用户发送是否存在真实副本(检查姓名,地址等)。
2)制作名称和地址的复合主键,它永远不会允许重复。 (不推荐,因为你最好给用户一个友好的消息而不是sql错误)