【问题标题】:SQL Primary Key Duplicate ValuesSQL 主键重复值
【发布时间】:2016-08-08 19:44:58
【问题描述】:

我有一个包含 2 个主键列的表:ID 和 StudentID。

ID 列设置为 isIdentity = Yes 并自动递增。

我之前已经测试过多次,但是这次由于某种原因,当我在StudentID 上插入重复值时,它不会抛出错误,而是将其添加到数据库中。当我显示表格数据时,显示了 2 个相同的值。

这可能是什么问题?

【问题讨论】:

  • 你能分享你的实际表声明吗?听起来您没有指定 StudentID 是一个主键。如果您确实需要两个唯一列,您可以将一个作为主键并在另一个上创建唯一索引。
  • 您好,这里是表格截图:prntscr.com/at6grl

标签: sql database duplicates primary-key


【解决方案1】:

您在ID 和StudentID 上有一个复合主键。这意味着您的 ID 和 StudentID 的组合必须是唯一的。由于ID 是一个标识列,ID 和StudentID 的组合将始终是唯一的(因为ID 本身已经是唯一的)。

您只能将主键更改为 ID。然后您可以在StudentID 上添加唯一索引。例如:

create unique index idx_studentID on yourTable(StudentID)

这将确保 StudentID 列实际上只包含唯一值。

看起来您实际上可能不需要ID 专栏,但这比您原来的问题更广泛的讨论。

【讨论】:

  • 谢谢你的回复,我也想问一下,唯一索引可以作为另一个表的外键吗?
  • 谢谢,我遵循了您的解决方案,它工作正常,按预期在重复值上抛出错误,谢谢!
  • 唯一索引本身与外键无关。在您的情况下,您可以在唯一索引中使用 StudentID 并同时在外键中使用它。你可以像这样添加它:ALTER TABLE yourTable ADD FOREIGN KEY (StudentID) REFERENCES parentTable(StudentID).
【解决方案2】:

您不能有 2 个“主键”。您可以拥有一个 compound 主键(这意味着 combination 必须是唯一的,这就是您现在所拥有的。或者,您可以拥有一个“主”键和一个“独特”的约束,这听起来像你想要。

【讨论】:

  • 感谢您的回复,将设置更改,看看现在情况如何
【解决方案3】:

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

【讨论】:

  • 感谢回复,所以设置1个主键和另一个唯一键。我还想问一下,主键从唯一键中具有哪些特征,它们的工作方式相同(不允许重复值)还是还有更多?
【解决方案4】:

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

  1. 任何表都可以有您可以在表上设置的身份密钥。这里种子可以说是 1,然后将其递增 1。因此递增顺序将像 1、2、3...等等。

  2. 主键,可以在表的特定列上定义。标识键可以用作主键。但是您可以在同一张表上拥有标识列以及主键。主键是唯一的一个表。因此,如果您将身份视为主键,那么您将没有更多的表列作为主键。

  3. 唯一键,可以与您的表格多列。

在从表数据中获取行时,如果您提供标识键、主键和唯一键的组合,那么搜索将是最快的

【讨论】:

  • 对,这样我就可以去掉Identity键上的主键,只为studentID设置主键?
【解决方案5】:

在我的第一个回复中,我提到可以通过软编码生成标识列,它不会被视为主键。以下是创建表时可以使用的语法。

1] 如果希望将标识列设置为主键 --id int identity(1,1) 主键 2]如果不想将标识列设置为主键并且仍然希望 对于我们的身份列,然后不要使用身份列的主键。 --id int 身份(1,1) 在这 2] 情况下,可能会在其他表列上创建主键。

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 2014-08-24
    • 2020-03-20
    • 1970-01-01
    • 2017-12-20
    • 2020-07-27
    • 2020-09-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多