我有一个包含2个主键列的表:ID
和StudentID
。
ID
列设置为isIdentity = Yes
并自动增加。
我之前已多次测试过,但由于某种原因,这次,当我在StudentID
上插入重复值时,它不会抛出错误,而是将其添加到数据库中。当我显示表格数据时,会显示2个相同的值。
这里有什么问题?
答案 0 :(得分:5)
您在ID
和StudentID
上有一个复合主键。这意味着您将ID和StudentID组合在一起必须是唯一的。由于ID
是一个标识列,ID
和StudentID
的组合始终是唯一的(因为ID
本身已经是唯一的)。
您可以将主键更改为仅在ID
。然后,您可以在StudentID
上添加唯一索引。例如:
create unique index idx_studentID on yourTable(StudentID)
这将确保StudentID列实际上只包含唯一值。
您似乎可能实际上不需要ID
列,但这比原始问题的讨论要广泛得多。
答案 1 :(得分:0)
你不能拥有2个“主键”。您可以拥有复合主键(意味着组合需要是唯一的,这就像您现在所听到的那样。或者,您可以拥有一个“主”键和一个“独特”约束,这听起来像你想要。
答案 2 :(得分:0)
您不能拥有2个主键。如果需要,您可以拥有多个唯一键,这可以帮助您。确保返回创建表格并仔细检查哪个列是您的主键并从那里开始工作。
答案 3 :(得分:0)
不要混淆身份,主键和唯一键。
任何表都可以拥有您可以在表上设置的标识密钥。这里的种子可以说是1,然后将其递增1.因此增量订单会像1,2,3 ......等等。
主键,可以在表的特定列上定义。身份密钥可以用作主键。但是你可以在同一个表上拥有标识列和主键。主键是一个且仅用于表。因此,如果您将标识视为主键,则您将没有其他表列作为主键。
唯一键,与您的表格可以有多个列。
从表数据中提取行时,如果提供身份键,主键和唯一键的组合,则搜索将是最快的
答案 4 :(得分:0)
在我的第一次回复中,我提到可以通过软编码生成标识列,并且不会将其视为主键。以下是创建表时可以使用的语法。
1]如果希望将标识列设置为主键 --id int identity(1,1)主键 2]如果一个人不希望将标识列设置为主键并仍然希望 给我们身份栏,然后给我们一个字主键为标识栏。 --id int identity(1,1) 在这种情况下,可以在其他表列上创建主键。