首页 > 解决方案 > PHP MySQL Insert INTO...ON Duplicate Key Update Where

问题描述

我需要在票表中不存在行时插入和/或在行存在时通过 1 个查询进行更新。

我尝试了以下方法,它没有添加新记录,也没有增加现有记录。

$query_upsert = mysqli_query($mysqli, 
    "INSERT INTO tickets (
        ticket_companyname,
        ticket_ordernumber,
        ticket_datetimedeliverydate,
        ticket_ritech,
        ticket_ticketstatus
    )
    SELECT 
        nextgenorder_companyname, 
        nextgenorder_ordernumber,
        nextgenorder_deliverydate,
        '$ticket_ritech',
        '$ticket_ticketstatus'
    FROM nextgenorders2 
    WHERE 
        nextgenorder_companyname LIKE CONCAT(SUBSTRING_INDEX('$nextgenorder_companyname', ' ', 1),'%') 
        AND nextgenorder_deliverydate='$nextgenorder_deliverydate'
    ON DUPLICATE KEY UPDATE,
         ticket_companyname='$ticket_companyname',
         ticket_ordernumber='$ticket_ordernumber',
         ticket_datetimedeliverydate='$ticket_datetimedeliverydate',
         ticket_ritech='$ticket_ritech',
         ticket_ticketstatus='$ticket_ticketstatus'
    WHERE
        ticket_companyname LIKE CONCAT(SUBSTRING_INDEX('$nextgenorder_companyname', ' ', 1),'%') 
        AND ticket_datetimedeliverydate='$nextgenorder_deliverydate'
    )"
);

你可以在 upsert 查询中使用 WHERE 子句吗?我有所有错误,我没有收到任何错误。

请帮忙。

谢谢,

标签: phpmysqlsqlsql-inserton-duplicate-key

解决方案


您的查询存在的问题和可能的改进:

  • 它有两个WHERE子句:你只想要一个,它应该出现在SELECT子句之后

  • 您对 SQL 注入持开放态度,您应该使用绑定参数

  • 您不需要在赋值右侧重复参数:相反,您可以使用VALUES语法

  • 另外我认为您正在尝试更新子句中的太多字段ON DUPLICATE KEY,我删除了其中一些并让那些我认为相关的字段(本质上,您不需要更新起作用的列来检查冲突)

考虑:

INSERT INTO tickets (
    ticket_companyname,
    ticket_ordernumber,
    ticket_datetimedeliverydate,
    ticket_ritech,
    ticket_ticketstatus
)
SELECT 
    nextgenorder_companyname, 
    nextgenorder_ordernumber,
    nextgenorder_deliverydate,
    ?,                          --> query parameter for "ticket_ritech"
    ?,                          --> ... "ticket_ticketstatus"
FROM nextgenorders2 
WHERE 
    nextgenorder_companyname 
        LIKE CONCAT(SUBSTRING_INDEX(?, ' ', 1),'%') --> ... "nextgenorder_companyname"
    AND nextgenorder_deliverydate = ?               --> ... "nextgenorder_deliverydate"
ON DUPLICATE KEY UPDATE,
    ticket_ritech = VALUES(ticket_ritech)
    ticket_ticketstatus = VALUES(ticket_ticketstatus)

推荐阅读