2010-08-13 2 views
4

У меня есть информационная таблица с более чем 130 столбцами/полями.mysql/php insert/update on duplicate key

Я хочу написать php-скрипт, который добавляет новый продукт в таблицу ИЛИ обновляет существующий продукт, если он уже существует. Первое поле - это ключ продукта.

Информация о продукте хранится в числовом массиве php: $ product_info [0] до $ product_info [130].

В основном что-то вроде этого:

INSERT INTO table (a,b,c) VALUES ($product_info[0],$product_info[1],$product_info[2]) 
    ON DUPLICATE KEY UPDATE a='$product_info[0]', b='$product_info[1]', c='$product_info[2]' 

Есть ли что-то более эффективное, чем ввод каждого из 130 полей в два раза?

+6

Почему на земле вы бы 130 столбцов в Таблица? Или ваша терминология неверна в том, что вы хотите вставить 130 строк/элементов? –

+0

Как следует из @premiso, это, вероятно, не идеально с точки зрения схемы. Что представляют эти данные? –

+0

Нет более 130 столбцов деталей продукта ... Не мой выбор. – Enkay

ответ

1

К сожалению, MySQL не поддерживает слияние ... имея ОРМ может помочь облегчить боль кодирования множественного IF EXISTS UPDATE ... ELSE кода ВСТАВИТЬ

9

Да, есть, использовать VALUES() функции:

INSERT INTO `table` (a, b, c) VALUES (?, ?, ?) 
    ON DUPLICATE KEY UPDATE a = VALUES(a), b = VALUES (b), c = VALUES(c) 

В основном, в части UPDATE, VALUES(column) вернет указанное значение для этого столбца для текущей строки. Таким образом, вы можете делать интересные вещи, как:

ON DUPLICATE KEY UPDATE 
    a = VALUES(a), 
    b = VALUES(b) + VALUES(c), 

красоту этого синтаксиса, он также поддерживает несколько строк вставки:

INSERT INTO `table` (a, b, c) 
    VALUES (?, ?, ?), 
    VALUES (?, ?, ?), 
    VALUES (?, ?, ?) 
    ON DUPLICATE KEY UPDATE a = VALUES(a), b = VALUES (b), c = VALUES(c) 
+1

Спасибо за ваш ответ, но мне все равно придется набирать все 130 полей дважды. Это в основном решение, которое я разместил в своем вопросе с небольшим завихрением. Я ищу что-то более эффективное, если это выполнимо. – Enkay

+0

Типо: 'KYE' должно быть' KEY'. Это однобуквенное изменение, поэтому я не могу сделать это сам. – TRiG

1
+2

Нет. Не используйте 'REPLACE', если вам нужна ссылочная целостность. Он удаляет, если существует, а затем вставляет. Таким образом, это разрушит любые отношения с внешним ключом. – ircmaxell

+0

Теперь PHP-код проверяет, существует ли строка. Если он не существует, он выполняет INSERT. Если он существует, он выполняет запрос DELETE, за которым следует запрос INSERT. – Enkay

+1

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – dgw