PHP MySQL Вставить INTO ... ON Обновление дубликата ключа Где - PullRequest
0 голосов
/ 11 марта 2020

Мне нужно вставить, когда строки не существуют в таблице заявок, и / или обновить, если строки существуют с одним запросом.

Я попробовал следующее, и он не добавляет новые записи, и это не Не используйте существующие записи.

$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'
    )"
);

Можете ли вы использовать предложение WHERE в запросе upsert? У меня есть все ошибки, и я не получаю никаких ошибок.

Пожалуйста, помогите.

Спасибо,

1 Ответ

1 голос
/ 11 марта 2020

Проблемы и возможные улучшения в вашем запросе:

  • у него есть два предложения 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)
...