За последние 24 часа нас посетили 20965 программистов и 1107 роботов. Сейчас ищут 405 программистов ...

Обновление записей в базе

Тема в разделе "MySQL", создана пользователем Yankovitz, 21 янв 2018.

  1. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Добрый день. Вставляю записи в базу с проверкой, если совпадает ключ со значением у записи с уникальным id, то должно обновить. Однако не пашет. В чем может быть проблема?
    Код (Text):
    1. $wpdb->query("INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES " . implode(',', $VALUES) . " ON DUPLICATE KEY UPDATE meta_value = VALUES(meta_value), meta_key = VALUES(meta_key); ");
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    SQL запрос пробовал через PHPMyAdmin выполнять? Он может на ошибки указать или сообщить об обновлении записей или пустом результате
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Yankovitz, загляните в описание класса wpdb.
    Обратите внимание на обработку ошибок ((show/hide/print)_error и last_error)
     
  4. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Понял в чем ошибка. Таблица базы данных выглядит следующим образом:
    Код (Text):
    1. post_id, meta_key, meta_value
    2. 1, thumb, 100
    3. 1, size, 13
    4. 1, weight, 500
    Первый индекс не уникальный. Помогите, пожалуйста, составить запрос, чтобы сопоставлял post_id и meta_key. Если эти ключи совпали, и meta_value отличается, то перезаписать, если совпадение отсутствует, то записать новую строку, если ключи и meta_value совпадают, то пропустить.
    Нашел в сети вот это:
    https://ru.stackoverflow.com/questi...ющую-запись-с-помощью-on-duplicate-key-update
    не уверен как прикрутить?
     
  5. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Прочитал, что вроде как primary key можно создать из post_id и meta_key. Только как это делается?
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    PHP:
    1. ALTER TABLE `table_name`
    2.   ADD PRIMARY KEY (`column_name`);
     
  7. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Спасибо, откуда мне взять ALTER TABLE `table_name`?
    --- Добавлено ---
    И еще можно ли запросом типа:
    Код (Text):
    1.  
    2. ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = VALUES(meta_key), VALUES(meta_value) )
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это совсем не то.
    Тут, при попытке дублирования уникальной записи, будет обновлено старое значение.

    Чтобы столбец сделать первичным ключом, нужно выполнить запрос, который я дал выше.

    Что именно брать?. Выполни запрос выше, вместо table_name and columnt_name вставь нужные данные.
    --- Добавлено ---
    или же при создании таблицы сразу можно указать:
    PHP:
    1. CREATE TABLE `table_name`(
    2.     `id` INT PRIMARY KEY AUTO_INCREMENT
    3. );
     
  9. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Собственно, мне как раз и нужно просто обновить значение. Либо через условие IF, либо другим путем. Уже весь мозг съел. Прошу помощи. С MySql имею дело крайне редко
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Покажи запрос, который у тебя не проходит.
     
  11. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    PHP:
    1. $wpdb->query("INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES "
    2. ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' )" ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = VALUES(meta_key), VALUES(meta_value) ); ");
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    У тебя есть чисто MySQL запрос, без php?
    Дай больше инфы, какая ошибка вообще? "Не пашет" ни о чем не говорит))
     
  13. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    PHP рабочий. Проверял так:
    Код (Text):
    1. $wpdb->query("INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES "
    2. ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) ");
    Вставка строк происходит. Здесь все пучком.
    Попробовал прямой запрос в phpmyadmin:
    Код (Text):
    1. INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = 2521, VALUES(meta_value), meta_value )
    Вставляет новые строки (НО НЕ ОБНОВЛЯЕТ!!!!). Если убрать последний третий параметр в условии IF:
    meta_value = IF( meta_key = 2521, VALUES(meta_value), "убираю параметр")
    на сколько мне известно он не обязательный, то происходит ошибка:
    Код (Text):
    1. Статический анализ:
    2.  
    3. Найдено 10 ошибок при анализе.
    4.  
    5. Неизвестное ключевое слово. (near "KEY" at position 199)
    6. Неожиданный токен. (near "=" at position 221)
    7. Неизвестное ключевое слово. (near "IF" at position 223)
    8. Неожиданный токен. (near "(" at position 225)
    9. Неожиданный токен. (near "meta_key" at position 227)
    10. Неожиданный токен. (near "=" at position 236)
    11. Неожиданный токен. (near "2521" at position 238)
    12. Неожиданный токен. (near "," at position 242)
    13. This type of clause was previously parsed. (near "VALUES" at position 244)
    14. Unrecognized statement type. (near "VALUES" at position 244)
    15. SQL запрос:
    16.  
    17. INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = 2521, VALUES(meta_value) )
    18.  
    19. Ответ MySQL: Документация
    20.  
    21. #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около ')' на строке 1
    --- Добавлено ---
    Пардон, немного не так:
    INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = price, VALUES(meta_value), meta_value )
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Покажи структуру таблицы `wp_postmeta`
     
  15. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Чистый MySQL:
    Немного упрощу:
    Код (Text):
    1. INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', 'иии' ),( 2521, 'price', 'иии' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = VALUES(meta_key), VALUES(meta_value), meta_value)
     
  16. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Разницы нету, что предыдущий что этот, я думаю, если все правильно понял, тут IF не нужен, если какой то столбец в базе у тебя уникальный, то если будет попытка дублирования сработает часто ON DUPLICATE KEY тут и обновляй запись, которая требует обновелния.

    Теперь, надо убедиться, есть ли у тебя в базе уникальные столбцы?
     
  17. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    [​IMG]
    --- Добавлено ---
    Уникальные столбцы есть, но проблема с их получением
     
  18. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Покажи структуру таблицы, не данные. И там внизу есть пункт "Индексы" его тоже разверни, чтобы можно было глянуть есть ли там индексы
     
  19. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Ладно, я уж тогда попробую заморочиться с meta_id. Просто, я думал, что есть адекватный способ, как по не уникальным post_id и meta_key обновить meta_value. Все равно благодарю за помощь.
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Чтобы сработал запрос, ты должен столбец сделать уникальным, без этого никак.
     
    Yankovitz нравится это.