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