2017-07-30 135 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 
} 
相关问题