我有以下情况:
在我的数据库中,我有一个名为 Person 的表。一个人有身份证。在我的概念模型中,学生是从人继承的,所以我有另一个名为学生的表。
我编写了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 数据添加到表中。
问题是我收到了这个错误:
密钥" PRIMARY"
的重复条目(id)
我不明白,因为这个密钥需要相同。
答案 0 :(得分:2)
异常消息非常清楚:
密钥“PRIMARY”的重复条目(id)
您正在复制表格上的ID。 你没有说出这是发生了哪一行,所以,让我们假设两种可能性(并且错误不在其他地方)。
在这种情况下,如果此表的PRIMARY KEY是AUTO INCREMENT,则无法进行此操作。如果不是,并且您自己插入记录的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
}
首先,假设您在此处显示的您插入STUDENT的ID不是表学生的PRIMARY KEY,而只是表PERSON的FK(外键)。
在这种情况下,项目1的相同内容适用于此处。您正在表格中输入重复的ID。使用第1项中的相同方法来验证这一点。
但是如果来自PERSON的ID与STUDENT中的ID(ONE to ONE关系)真的相同,那么问题是什么?
完全一样。您输入的是重复的ID。
因此,无论错误发生在何处,您都允许代码尝试在表中插入DUPLICATE ID(主键)。
同样,您必须手动创建ID,因为自动增量主键不会导致此问题(除非您手动设置ID,在这种情况下,MySQL将使用此值而不是自动值)。 / p>
如果您手动创建ID,则必须确保它们不是重复的。
答案 1 :(得分: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);