MySQL UPDATE外键约束失败

时间:2017-07-30 22:03:09

标签: mysql go

对于初学者,我已经看到了其他答案,他们解决了其他类似问题的问题,但我不明白失败的原因或如何解决它,因为其他答案说“检查是否”记录存在于另一个表中以插入正确的关系,否则会出现此错误“。这与我正在尝试做的事情无关(我认为);我只是想更新表中特定项的数据,我不想更新任何关系,只需更新外键ID。

这是我的错误:

  

错误1452:无法添加或更新子行:外键约束失败(appitem,CONSTRAINT item_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)
);

为什么会出现此错误?我该如何解决?

1 个答案:

答案 0 :(得分: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
}