INSERT ...当键不是一直都知道时,在DUPLICATE KEY UPDATE上?

时间:2015-08-29 06:53:52

标签: php mysql

我正在尝试更新记录,如果密钥是已知的,我想插入它并获取插入的ID,目前我有:

    if(isset($data['applicationId']))
    {
        //update
        $sql="
         UPDATE myTable SET data='jsonstring' WHERE id = {$data['applicationId']}
        ";
    }
    else
    {
        //insert and get id
        $sql="
         INSERT INTO myTable SET data='jsonstring'
        ";
    }

即使密钥并不总是已知,是否可以使用INSERT ...ON DUPLICATE KEY UPDATE将上述简化为一个查询?

我试过这个:

        INSERT INTO myTable
        (
            id,
            data

        )
        VALUES
        (
            ?, # <- I may not know this!!
            'jsonstring'
        )
        ON DUPLICATE KEY UPDATE 
            data = 'jsonstring'

感谢您的任何建议。

3 个答案:

答案 0 :(得分:1)

是的,你可以这样做,假设id是你的主键和auto_increment。您将有两个不同的查询,一个是您知道applicationId而另一个是您不知道的。

第一,当你知道的时候:

INSERT INTO myTable
(
    id,
    data
)
VALUES
(
    1337, # <- insert id
    'jsonstring'
)
ON DUPLICATE KEY UPDATE 
        data = 'jsonstring';

如果applicationId是未知的那个:

INSERT INTO myTable
(
    id,
    data
)
VALUES
(
    NULL, # <- This will cause mysql to use a auto_increment value
    'jsonstring'
)
ON DUPLICATE KEY UPDATE 
        data = 'jsonstring';

所以你可以得出结论:

    $sql="INSERT INTO myTable
        (
            id,
            data
        )
        VALUES
        (" .
            isset($data['applicationId']) ? $data['applicationId'] : 'NULL'
            .",
            'jsonstring'
        )
        ON DUPLICATE KEY UPDATE 
                data = 'jsonstring';
    ";

但要注意How can I prevent SQL-injection in PHP?

快乐编码

答案 1 :(得分:0)

请原谅,因为您的问题不是100%明确。但是,我能说的概念是你希望能够在1个sql语句中询问多个查询。这可以使用多查询命令完成。但是,如果您希望查询中的某些数据放在下一个查询中,我认为它不会起作用。为multi_query

提供的链接

http://php.net/manual/en/mysqli.quickstart.multiple-statement.php

答案 2 :(得分:0)

First, Simple update query will run. If it runs successfully, it will not go to if condition and your ID will be the one which was used in updating.

And, if that ID is not available (means update query fails, $Query will be false), so pointer jumps to if condition and insert the query. Now, new Inserted ID we can get.

$ID=$data['applicationId'];
    $Query=mysql_query("UPDATE myTable SET data='jsonstring' WHERE id='$ID' ");
    if(!$Query)
    {
       $InsertQuery=mysql_query("INSERT INTO myTable SET data='jsonstring'");
       $ID=mysql_insert_id();
    }

    So, $ID will be your ID.(either updated or currently inserted)