对于初学者,我已经看到了其他答案,他们解决了其他类似问题的问题,但我不明白失败的原因或如何解决它,因为其他答案说“检查是否”记录存在于另一个表中以插入正确的关系,否则会出现此错误“。这与我正在尝试做的事情无关(我认为);我只是想更新表中特定项的数据,我不想更新任何关系,只需更新外键ID。
这是我的错误:
错误1452:无法添加或更新子行:外键约束失败(
app
。item
,CONSTRAINTitem_tax_fk
FOREIGN KEY(tax_id
)REFERENCES {{ 1}}(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)
);
为什么会出现此错误?我该如何解决?
答案 0 :(得分:0)
感谢@Barmar。不得不将"NULL"
更改为nil
。 “
当字符串转换为数字时,如果它不以数字“。
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
}