0
對於初學者,我已經看到了其他答案,他們解決了其他類似問題的問題,但我不明白失敗的原因或如何解決,因爲其他答案都是這樣說的例如「檢查記錄是否存在於另一個表中以插入其正確的關係,否則會發生此錯誤」。這與我想要做的事情沒有關係(我認爲);我只想更新表中某個特定項目的數據,我不想更新任何關係,只需更新外鍵標識。MySQL更新外鍵約束失敗
這是我的錯誤:
Error 1452: Cannot add or update a child row: a foreign key constraint fails (
app
.item
, CONSTRAINTitem_tax_fk
FOREIGN KEY (tax_id
) REFERENCEStax
(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
}
爲什麼我得到這個錯誤?我該如何解決它?
您必須在'tax'表中存在id,然後才能將外鍵添加到'item'表中。 – Barmar
你想在'item'表中分配什麼'tax_id'?那個'id'的'tax'表中有一行嗎? – Barmar
好的,這是有道理的。但在這種情況下,ID *確實存在,因爲我從預先存在的稅收清單中進行選擇,因此它必須存在,我不明白爲什麼它會拋出錯誤。 – Lansana