SQL主键重复数值

4
我有一个表格,其中有两列主键:IDStudentIDID列设置为isIdentity = Yes并带有自动递增功能。
我之前测试过多次,但是这一次出现了问题,当我在StudentID上插入重复值时,它不会抛出错误,而是将其添加到了数据库中。当我显示表格数据时,会出现两个相同的值。
这里可能出了什么问题?

1
你能分享一下你实际的表声明吗?听起来你没有指定StudentID为唯一主键。如果你真的需要两个唯一列,你可以将一个设置为主键,并在另一个上创建一个唯一索引。 - user212514
你好,这是表格的截图:http://prntscr.com/at6grl - t_Consumer
5个回答

8
您在 IDStudentID 上有一个复合主键。这意味着 ID 和 StudentID 的组合必须是唯一的。由于 ID 是一个标识列,所以 IDStudentID 的组合将始终是唯一的(因为 ID 本身已经是唯一的)。
您可以将主键更改为仅在 ID 上。然后,您可以在 StudentID 上添加唯一索引。例如:
create unique index idx_studentID on yourTable(StudentID)

这将确保“学生ID”列实际上只包含唯一的值。

看起来你可能实际上不需要“ID”列,但这是比你最初的问题更广泛的讨论。


谢谢回复,我还想问一下,唯一索引能否用作另一个表的外键? - t_Consumer
谢谢,我按照你的解决方案操作了,它运行得很好,当出现重复值时如预期那样抛出了一个错误,非常感谢! - t_Consumer
一个唯一索引本身与外键无关。在您的情况下,您可以在唯一索引中使用“StudentID”,同时在外键中使用它。您可以像这样添加它:ALTER TABLE yourTable ADD FOREIGN KEY (StudentID) REFERENCES parentTable(StudentID) - user212514

0
在我的第一次回复中,我提到可以通过软编码生成身份列,并且它不会被视为主键。以下是创建表时可以使用的语法。
1] 如果希望将标识列设置为主键 --id int identity(1,1) primary key
2] 如果不希望将标识列设置为主键,但仍希望使用标识列,则不要为标识列使用主键关键字。 --id int identity(1,1) 在这种情况下,可以在其他表列上创建主键。

0
你不能有两个“主键”。你可以有一个复合主键(意味着组合必须是唯一的,这听起来就像是您现在拥有的)。或者,您可以有一个“主”键和一个“唯一”约束条件,这听起来就像是您想要的

谢谢您的回复,我会进行更改并查看现在的情况。 - t_Consumer

0

你不能有两个主键。如果需要,你可以有多个唯一键,这应该对你的情况有所帮助。确保返回到你的表创建并仔细检查哪一列是你的主键,然后从那里开始工作。


谢谢回复,所以设置一个主键和另一个唯一键。我还想问一下主键与唯一键的特点有什么区别,它们是否起到相同的作用(不允许重复值),或者还有其他方面的区别? - t_Consumer

0

不要混淆身份、主键和唯一键。

  1. 任何表格都可以拥有身份密钥,你可以在表格上设置。在这里种子可以是1,然后递增1。所以递增顺序将是1、2、3...以此类推。

  2. 主键可以定义在特定的表格列上。身份密钥可以用作主键。但你也可以在同一个表格上拥有身份列以及主键。主键是表格的唯一键。因此,如果你将身份视为主键,则在表格列中将没有其他主键。

  3. 唯一键可以是表格中多个列。

当从表格数据中提取行时,如果提供了身份密钥、主键和唯一键的组合,则搜索速度最快。


好的,那我可以移除Identity键上的主键,然后将主键设置为studentID吗? - t_Consumer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接