如果存在则更新PHP MYSQL,否则插入?

77
我不确定这是否正确。我有一个类,想要在字段存在时更新数据库,如果它们不存在则插入。问题是我正在连接3个表(set_colors、school_art和baseimage)。
非常感谢任何帮助。
以下是我的代码:
public function set_layer_colors($value) {
    global $db;

    $result_array = mysql_query("
    IF EXISTS(SELECT * FROM set_colors WHERE school_art_id = '{$value}')

      UPDATE set_colors (school_art_id, baseimage_id, sub_folder, layer)
        SELECT school_art.id, baseimage.id, baseimage.sub_folder, baseimage.layer
        FROM school_art 
        JOIN baseimage ON baseimage.base_folder = school_art.series_code 
        WHERE baseimage.image_type = 'B' ORDER BY school_art.id 

    ELSE

     INSERT INTO set_colors (school_art_id, baseimage_id, sub_folder, layer)
        SELECT school_art.id, baseimage.id, baseimage.sub_folder, baseimage.layer
        FROM school_art 
        JOIN baseimage ON baseimage.base_folder = school_art.series_code 
        WHERE baseimage.image_type = 'B' ORDER BY school_art.id 
        ");

    return $result_array;
}
2个回答

197

我认为您正在寻找以下语法:

INSERT INTO <table> (field1, field2, field3, ...) 
VALUES ('value1', 'value2','value3', ...)
ON DUPLICATE KEY UPDATE
field1='value1', field2='value2', field3='value3', ...

注意:使用ON DUPLICATE KEY UPDATE时,每行受影响的行数为1,如果该行作为新行被插入,则为2,如果更新了现有行,则为更新,如果现有行设置为其当前值,则为0

MySQL文档:INSERT ... ON DUPLICATE KEY UPDATE语句


6
更准确地说,您不需要指定主键的指示。因此,如果field1是一个键,那么在重复键时更新field2='value2',field3='value3'等(从field2开始)。 - giacoder
1
只需记得给目标列添加UNIQUE约束即可。 - Robert Sinclair
1
@StefanoZanetti,你的字段名称不匹配:pswpassword。此外,在ON DUPLICATE KEY UPDATE子句中,你没有指定role字段(我不确定这是否重要)。 - Tash Pemhiwa

34

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - marco
6
如果我们使用 "REPLACE INTO",则如果主表中的数据已存在,其他外键关联表的数据将被删除。 - Angga Lisdiyanto
1
关于 REPLACE 的注意事项 -- 它会隐式地删除它尝试更新的条目并添加一个新条目,因此如果您有一个 AUTO_INCREMENT 键,例如 ID,它也将自动递增! - c00000fd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接