PHP MYSQL UPDATE, если существует, или INSERT, если нет?

Я понятия не имею, если это даже отдаленно правильно. У меня есть класс, в котором я хотел бы обновить базу данных, если поля в настоящее время существуют, или вставить, если их нет. Сложность в том, что я соединяю 3 таблицы (set_colors, school_art, baseimage)

Любая помощь будет действительно здорово.

Вот что у меня есть:

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;
}

person GGcupie    schedule 28.07.2011    source источник


Ответы (2)


Я считаю, что вы ищете следующий синтаксис:

INSERT INTO <table> (field1, field2, field3, ...) 
VALUES ('value1', 'value2','value3', ...)
ON DUPLICATE KEY UPDATE
field1='value1', field2='value2', field3='value3', ...

Примечание. При использовании ON DUPLICATE KEY UPDATE значение затрагиваемых строк для каждой строки равно 1, если строка вставляется как новая строка, и 2, если существующая строка обновляется и 0, если для существующей строки установлены текущие значения.

Документация MySQL: INSERT ... ON DUPLICATE KEY UPDATE Statement

person Tash Pemhiwa    schedule 28.07.2011
comment
Чтобы быть более точным, вам не нужно указывать первичные ключи. Итак, если field1 является ключом, то ...... ON DUPLICATE KEY UPDATE field2='value2', field3='value3',... (начиная с field2) - person giacoder; 03.07.2014
comment
просто не забудьте указать для целевого столбца ограничение UNIQUE - person Robert Sinclair; 13.05.2018
comment
@StefanoZanetti, имена ваших полей не совпадают: psw и password. Кроме того, вы не указали поле role в предложении ON DUPLICATE KEY UPDATE (я не уверен, имеет ли это значение). - person Tash Pemhiwa; 03.04.2019

Два варианта:

Руководство по MySQL :: INSERT INTO... ON DUPLICATE KEY ОБНОВЛЕНИЕ Синтаксиса

or

Руководство по MySQL :: REPLACE INTO Syntax

Оба позволят вам выполнить вставку, если не существует, или обновление в одном запросе.

person Dan Grossman    schedule 28.07.2011
comment
Спасибо, REPLACE INTO намного лучше для моего случая, иначе мне пришлось бы вызывать $query-›send_long_data(1, $buff) дважды, один раз для ВСТАВКИ и один для ОБНОВЛЕНИЯ - person marco; 15.01.2015
comment
Нееет... Если мы используем REPLACE INTO , данные другой связанной таблицы FOREIGN KEY будут удалены, если PRIMARY данные существуют. - person Angga Lisdiyanto; 02.04.2016
comment
Обратите внимание на REPLACE — он неявно удаляет запись, которую пытается обновить, и добавляет новую, поэтому, если у вас есть ключ AUTO_INCREMENT, такой как ID, он также будет автоматически увеличен! - person c00000fd; 03.01.2020