2016-08-27 13 views
1

我有以下情況:MySQL的 - 對於重複鍵輸入「主」

在我的數據庫,我有一個表稱爲。一個人有一個ID。在我的概念模型中,學生是從人身上繼承下來的,所以我有另一張叫的學生

我寫C#代碼插入到學生表:

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(); 

很顯然,我需要將值加入到類第一,因爲每個學生都是一個人。所以,在我這樣做之後,我嘗試將剩餘的學生數據添加到表格中。

的問題是,我收到此錯誤:

Duplicate entry (id) for key "PRIMARY"

我不明白,既然這個關鍵需求是相同的。

+1

安置自己的表的模式。 –

+0

您是否已檢查http://stackoverflow.com/questions/11638505/1062-duplicate-entry-for-key-primary? – Fruchtzwerg

+1

你爲什麼不''AUTO_INCREMENT'呢? –

回答

1

異常消息是相當清楚的:

Duplicate entry (id) for key "PRIMARY"

你是在一個表中複製ID。 你沒有告訴在哪一行發生,所以,讓我們假設兩種可能性(並且錯誤不在別處)。

  1. 當您嘗試插入表PERSON中時發生異常。

在這種情況下,如果此表的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,而只是一個FK(外鍵)到PERSON表。

    在這種情況下,第1項與第1項相同。您在表格中輸入重複的ID。使用第1項中的相同方法驗證此情況。

    但是,如果來自PERSON的ID與STUDENT(一對一關係)的ID相同,那麼問題是什麼?

    完全一樣。你正在輸入一個重複的ID。

    因此,不管錯誤發生在哪裏,您都允許您的代碼嘗試在表中插入DUPLICATE 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);