2017-07-30 241 views
0

對於初學者,我已經看到了其他答案,他們解決了其他類似問題的問題,但我不明白失敗的原因或如何解決,因爲其他答案都是這樣說的例如「檢查記錄是否存在於另一個表中以插入其正確的關係,否則會發生此錯誤」。這與我想要做的事情沒有關係(我認爲);我只想更新表中某個特定項目的數據,我不想更新任何關係,只需更新外鍵標識。MySQL更新外鍵約束失敗

這是我的錯誤:

Error 1452: Cannot add or update a child row: a foreign key constraint fails (app . item , CONSTRAINT item_tax_fk FOREIGN KEY (tax_id) REFERENCES tax (id))

這是我的查詢(問號將被轉換爲數值):

UPDATE item 
SET tax_id = ?, name = ?, description = ?, price = ? 
WHERE id = ? 
LIMIT 1 

這是相關的架構:

CREATE TABLE tax (
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 

    name VARCHAR(255) NOT NULL, 
    rate FLOAT NOT NULL, 

    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    deleted_at TIMESTAMP NULL DEFAULT NULL, 

    PRIMARY KEY (id) 
); 

CREATE TABLE item (
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 

    tax_id INT(10) UNSIGNED NULL DEFAULT NULL, 
    name VARCHAR(255) NOT NULL, 
    description VARCHAR(1000) NOT NULL, 
    price FLOAT NOT NULL, 

    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    deleted_at TIMESTAMP NULL DEFAULT NULL, 

    CONSTRAINT `item_tax_fk` FOREIGN KEY (`tax_id`) REFERENCES `tax` (`id`), 

    PRIMARY KEY (id) 
); 

這是我的功能:

func (r *ItemRepository) UpdateByID(itemId int, item *domain.Item) error { 
    var err error 

    if item.Tax == nil { 
     _, err = r.db.Exec(` 
      UPDATE item 
      SET tax_id = ?, name = ?, description = ?, price = ? 
      WHERE id = ? 
      LIMIT 1 
     `, "NULL", item.Name, item.Description, item.Price, itemId) 
    } else { 
     _, err = r.db.Exec(` 
      UPDATE item 
      SET tax_id = ?, name = ?, description = ?, price = ? 
      WHERE id = ? 
      LIMIT 1 
     `, item.Tax.ID, item.Name, item.Description, item.Price, itemId) 
    } 
    if err != nil { 
     return err 
    } 

    return nil 
} 

爲什麼我得到這個錯誤?我該如何解決它?

+0

您必須在'tax'表中存在id,然後才能將外鍵添加到'item'表中。 – Barmar

+1

你想在'item'表中分配什麼'tax_id'?那個'id'的'tax'表中有一行嗎? – Barmar

+0

好的,這是有道理的。但在這種情況下,ID *確實存在,因爲我從預先存在的稅收清單中進行選擇,因此它必須存在,我不明白爲什麼它會拋出錯誤。 – Lansana

回答

0

由@Barmar修復。必須將"NULL"更改爲nil。 「 將字符串轉換爲數字時,如果不以數字開頭,則變爲0」。

func (r *ItemRepository) UpdateByID(itemId int, item *domain.Item) error { 
    var err error 

    if item.Tax == nil { 
     _, err = r.db.Exec(` 
      UPDATE item 
      SET tax_id = ?, name = ?, description = ?, price = ? 
      WHERE id = ? 
      LIMIT 1 
     `, nil, item.Name, item.Description, item.Price, itemId) 
    } else { 
     _, err = r.db.Exec(` 
      UPDATE item 
      SET tax_id = ?, name = ?, description = ?, price = ? 
      WHERE id = ? 
      LIMIT 1 
     `, item.Tax.ID, item.Name, item.Description, item.Price, itemId) 
    } 
    if err != nil { 
     return err 
    } 

    return nil 
} 
相關問題