如果存在PHP MYSQL UPDATE或不存在INSERT?


69

我不知道这是否真的正确。我有一个类,如果这些字段当前存在,我想在其中更新数据库,如果不存在则插入。复杂的是,我正在联接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;
}

Answers:


187

我相信您正在寻找以下语法:

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 Statement


6
为了更正确,您不需要主键的指示。因此,如果field1是键,则......在重复键更新上field2 ='value2',field3 ='value3',...(从field2开始)
giacoder

只要记住要给目标列提供唯一约束即可
罗伯特·辛克莱

1
@StefanoZanetti,您的字段名称不匹配:pswvs password。此外,您还没有role在ON DUPLICATE KEY UPDATE子句中指定字段(我不确定这是否重要)。
Tash Pemhiwa

34

两种选择:

MySQL手册:: INSERT INTO ... ON DUPLICATE KEY UPDATE语法

要么

MySQL手册::替换成语法

两者都可以让您在一个查询中执行“如果不存在或不进行插入”。


谢谢,对于我的情况而言,REPLACE INTO更好,否则我不得不两次调用“ $ query-> send_long_data(1,$ buff)”,一次用于INSERT,一次用于UPDATE
marco 2015年

6
不,...如果我们使用“ REPLACE INTO”,则如果存在PRIMARY数据,则其他与FOREIGN KEY相关的表的数据将被删除。
Angga Lisdiyanto '16

1
注意REPLACE-它会隐式删除尝试更新的条目并添加一个新条目,因此,如果您有一个AUTO_INCREMENT密钥(例如)ID,它也会自动递增!
c00000fd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.