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
Форумы портала PHP.SU :: Версия для печати :: удаление при добавлении
Форумы портала PHP.SU » » Работа с СУБД » удаление при добавлении

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

1. shurik330 - 01 Декабря, 2011 - 11:50:14 - перейти к сообщению
Здравствуйте.
Следующая проблема.
Есть база данных. В ней N-ое кол-во записей. Я добавляю еще какое-то кол-во записей.
Необходимо удалить из базы те данные, которых нет в добавляемых. Добавить те, которых еще нет, а какие совпадают - обновить их.
Т.е. в базе уже есть "1, 2, 3, 4". Добавляется "3, 4, 5, 6". В результате "3, 4, 5, 6".
Как это возможно реализовать?
Заранее спасибо.
2. EuGen - 01 Декабря, 2011 - 11:51:46 - перейти к сообщению
Обновлять при совпадении ключа.
http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]n-duplicate[dot]html
3. shurik330 - 01 Декабря, 2011 - 11:53:37 - перейти к сообщению
EuGen пишет:
Обновлять при совпадении ключа.
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Я делал с помощью INSERT IGNORE
4. EuGen - 01 Декабря, 2011 - 11:57:24 - перейти к сообщению
В рамках Вашей задачи это несколько не то. INSERT IGNORE пропустит записи при совпадении, ничего не делая. Вам же нужно обновить.
5. shurik330 - 01 Декабря, 2011 - 11:59:08 - перейти к сообщению
EuGen пишет:
В рамках Вашей задачи это несколько не то. INSERT IGNORE пропустит записи при совпадении, ничего не делая. Вам же нужно обновить.

Хорошо. А как теперь удалить те записи из базы, которых нет в добавляемых?
6. Мелкий - 01 Декабря, 2011 - 12:10:39 - перейти к сообщению
truncate (или delete всё) + insert
7. EuGen - 01 Декабря, 2011 - 12:11:58 - перейти к сообщению
Мелкий
Не уверен, что в общем случае это отвечает логике. Ведь, вероятно, есть желание сохранить id или, скажем, при INSERT обновлять не все поля, а только те, где есть пересечение.
8. shurik330 - 01 Декабря, 2011 - 12:12:37 - перейти к сообщению
Мелкий пишет:
truncate (или delete всё) + insert

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

Но все таки можно как-то реализовать?
9. EuGen - 01 Декабря, 2011 - 12:28:58 - перейти к сообщению
Можно. Есть два способа решения. Первый - выгрузить все ключи записей из БД в массив, пересечь его с массивом ключей для добавления и удалить из БД то, что не входит во второй массив. Выглядит примерно так:
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

 

Powered by ExBB FM 1.0 RC1