Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: удаление при добавлении

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
shurik330
Отправлено: 01 Декабря, 2011 - 11:50:14
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Здравствуйте.
Следующая проблема.
Есть база данных. В ней N-ое кол-во записей. Я добавляю еще какое-то кол-во записей.
Необходимо удалить из базы те данные, которых нет в добавляемых. Добавить те, которых еще нет, а какие совпадают - обновить их.
Т.е. в базе уже есть "1, 2, 3, 4". Добавляется "3, 4, 5, 6". В результате "3, 4, 5, 6".
Как это возможно реализовать?
Заранее спасибо.
 
 Top
EuGen Администратор
Отправлено: 01 Декабря, 2011 - 11:51:46
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Обновлять при совпадении ключа.
http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]n-duplicate[dot]html


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
shurik330
Отправлено: 01 Декабря, 2011 - 11:53:37
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




EuGen пишет:
Обновлять при совпадении ключа.
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Я делал с помощью INSERT IGNORE
 
 Top
EuGen Администратор
Отправлено: 01 Декабря, 2011 - 11:57:24
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В рамках Вашей задачи это несколько не то. INSERT IGNORE пропустит записи при совпадении, ничего не делая. Вам же нужно обновить.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
shurik330
Отправлено: 01 Декабря, 2011 - 11:59:08
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




EuGen пишет:
В рамках Вашей задачи это несколько не то. INSERT IGNORE пропустит записи при совпадении, ничего не делая. Вам же нужно обновить.

Хорошо. А как теперь удалить те записи из базы, которых нет в добавляемых?
 
 Top
Мелкий Супермодератор
Отправлено: 01 Декабря, 2011 - 12:10:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




truncate (или delete всё) + insert


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 01 Декабря, 2011 - 12:11:58
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Мелкий
Не уверен, что в общем случае это отвечает логике. Ведь, вероятно, есть желание сохранить id или, скажем, при INSERT обновлять не все поля, а только те, где есть пересечение.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
shurik330
Отправлено: 01 Декабря, 2011 - 12:12:37
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Мелкий пишет:
truncate (или delete всё) + insert

Нет, полностью нельзя удалять все данные из базы
(Добавление)
EuGen пишет:
Мелкий
Не уверен, что в общем случае это отвечает логике. Ведь, вероятно, есть желание сохранить id или, скажем, при INSERT обновлять не все поля, а только те, где есть пересечение.

Но все таки можно как-то реализовать?
 
 Top
EuGen Администратор
Отправлено: 01 Декабря, 2011 - 12:28:58
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Можно. Есть два способа решения. Первый - выгрузить все ключи записей из БД в массив, пересечь его с массивом ключей для добавления и удалить из БД то, что не входит во второй массив. Выглядит примерно так:
PHP:
скопировать код в буфер обмена
  1. $rSelect=mysql_query('SELECT id FROM `table`');
  2. $rgDBRecords=array();
  3. while($rgRow=mysql_fetch_array($rSelect))
  4. {
  5.    $rgDBRecords[]=$rgRow['id'];
  6. }
  7. //здесь мы предполагаем, что у нас есть $rgINSERTRecords - массив из id, которые будут в добавляемых записях
  8. $rgDiffRecords=array_diff($rgDBRecords, $rgINSERTRecords);
  9. if(count($rgDiffRecords))
  10. {
  11.    mysql_query('DELETE FROM `table` WHERE id IN ('.join(',', $rgDiffRecords).')');
  12. }

Вариант второй - создать временную таблицу, добавить все записи туда и уже потом удалять через JOIN, к примеру. Вот здесь есть пример: http://forum.php.su/topic.php?fo...8&topic=2885


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB