MySQL - "PRIMARY"键重复输入

3

我有以下情况:

在我的数据库中,有一个名为Person的表。一个人有一个ID。在我的概念模型中,学生是从人继承而来的,所以我有另一个名为Student的表。

我编写了C#代码来插入到Student表中:

string query = "INSERT INTO Person (ID, ...) VALUES("id",...);";
MySqlCommand command = new MySqlCommand(query, connection);
command.ExecuteNonQuery();
query = "INSERT INTO Student (..., ID) VALUES(...,"id");";
command.ExecuteNonQuery();

显然,我需要先在Person类中添加值,因为每个学生都是一个人。所以,在我完成这个步骤之后,我尝试将其余的Student数据添加到表中。
问题是我得到了以下错误:

重复的条目(id)键“PRIMARY”

我不理解,因为这个键应该是相同的。

1
请发布您的表模式。 - Andrej
1
为什么不使用AUTO_INCREMENT呢? - Raktim Biswas
@Rakitić 我只是为了问题而将其称为ID,它实际上并不是可以自动递增的东西。 - Eutherpy
如果第二次插入是到学生表中,你不应该收到主键冲突的错误信息……学生表中不能已经存在一个与你尝试添加的ID相同的学生,对吧? - Charles Bretana
我假设学生表中的ID属性是该表的主键,对吗? - Charles Bretana
显示剩余5条评论
2个回答

3
异常信息已经很明确了:
"PRIMARY"键的重复条目(id)
您正在对表进行ID重复。由于没有告知这是发生在哪一行,因此让我们假设两种可能性(并且错误不是在其他地方发生)。
1.当您尝试插入到PERSON表时,发生了异常。
在这种情况下,如果此表的主键是自动递增的,则不可能发生这种情况。如果不是,并且您正在自己插入记录的ID,则您的代码没有正确生成ID,并插入了已经存在于表中的值。
为了在运行时检查是否是这种情况,只需在实际插入之前选择要插入的ID:
string query = "SELECT count(*) FROM Person WHERE ID = " + id;
MySqlCommand command = new MySqlCommand(query, connection);
int count = (int)command.ExecuteScalar();
if (count > 0) 
{
  //You already inserted this ID. Warn the user
}
  1. 在向STUDENT表插入数据时出现异常

首先,假设您在此处显示的要插入STUDENT表的ID不是该表的主键,而只是指向PERSON表的外键。

在这种情况下,与第1项相同。您正在向表中输入重复的ID。使用第1项中的相同方法进行验证。

但是,如果PERSON的ID确实是STUDENT的ID(一对一关系),那么问题是什么?

完全相同。您正在输入重复的ID。

因此,无论错误发生在哪里,您都允许代码尝试在表中插入重复的ID(主键)。

再次强调,您必须手动创建ID,因为自增主键不会导致此问题(除非您手动设置ID,在这种情况下,MySQL将使用此值而不是自动值)。

如果您手动创建ID,则必须确保它们不重复。


0

我甚至不知道这应该被称为答案还是黑客,但它起作用了:

string query = "INSERT INTO Person (ID, ...) VALUES(id, ...); 
                INSERT INTO Student (..., ID) VALUES(..., (select ID from Person WHERE Person.ID = id));";
MySqlCommand command = new MySqlCommand(query, connection);

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