Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MYSQL更新(如果存在)或插入(如果不存在)?_Php_Mysql_Sql Update_Sql Insert_On Duplicate Key - Fatal编程技术网

PHP MYSQL更新(如果存在)或插入(如果不存在)?

PHP MYSQL更新(如果存在)或插入(如果不存在)?,php,mysql,sql-update,sql-insert,on-duplicate-key,Php,Mysql,Sql Update,Sql Insert,On Duplicate Key,我不知道这一点是否正确。我有一个类,如果字段当前存在,我想更新数据库;如果字段不存在,我想插入。复杂的是,我正在做一个连接3个表(设置颜色、学校艺术、基本图像) 任何帮助都会非常好 以下是我所拥有的: public function set_layer_colors($value) { global $db; $result_array = mysql_query(" IF EXISTS(SELECT * FROM set_colors WHERE school_art

我不知道这一点是否正确。我有一个类,如果字段当前存在,我想更新数据库;如果字段不存在,我想插入。复杂的是,我正在做一个连接3个表(设置颜色、学校艺术、基本图像)

任何帮助都会非常好

以下是我所拥有的:

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;
}
两种选择:


这两种方法都允许您在一个查询中执行插入(如果不存在)或更新操作。

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

INSERT INTO <table> (field1, field2, field3, ...) 
VALUES ('value1', 'value2','value3', ...)
ON DUPLICATE KEY UPDATE
field1='value1', field2='value2', field3='value3', ...
插入(字段1、字段2、字段3等)
值('value1','value2','value3',…)
关于重复密钥更新
field1='value1',field2='value2',field3='value3'。。。
注意:使用重复键更新时的
时,如果将行作为新行插入,则每行受影响的行值为
1
,如果更新现有行,则为
2
,如果将现有行设置为其当前值,则为
0


MySQL文档:

为了更准确,您不需要指示主键。因此,如果field1是一个键,那么。。。。。。在重复密钥更新字段2='value2',字段3='value3'。。。(从field2开始)请记住为目标列指定唯一的constraint@StefanoZanetti,您的字段名不匹配:
psw
vs
password
。此外,您还没有在ON DUPLICATE KEY UPDATE子句中指定
角色
字段(我不确定这是否重要)。谢谢,对于我的情况,替换为更好,否则我必须调用“$query->send_long_data(1,$buff)”两次,一次用于插入,另一次用于UPDATENOO。。。如果我们使用“替换到”,则如果主数据存在,其他外键相关表的数据将被删除。关于
REPLACE
,它会隐式删除它尝试更新的条目并添加一个新条目,因此如果您有
自动递增
键,例如
ID
,它也会自动递增!