PHP MySQL Insert INTO...ON Duplicate Key Update Where

PHP MySQL Insert INTO...ON Duplicate Key Update Where

当工单中不存在行时我需要插入 table and/or 当行确实存在时更新 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 子句吗?我有所有错误,但我没有收到任何错误。

请帮忙。

谢谢,

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

  • 它有两个 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)