Здравствуйте.
Следующая проблема.
Есть база данных. В ней N-ое кол-во записей. Я добавляю еще какое-то кол-во записей.
Необходимо удалить из базы те данные, которых нет в добавляемых. Добавить те, которых еще нет, а какие совпадают - обновить их.
Т.е. в базе уже есть "1, 2, 3, 4". Добавляется "3, 4, 5, 6". В результате "3, 4, 5, 6".
Как это возможно реализовать?
Заранее спасибо.
1. shurik330 - 01 Декабря, 2011 - 11:50:14 - перейти к сообщению
2. EuGen - 01 Декабря, 2011 - 11:51:46 - перейти к сообщению
Обновлять при совпадении ключа.
http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]n-duplicate[dot]html
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
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 обновлять не все поля, а только те, где есть пересечение.
Не уверен, что в общем случае это отвечает логике. Ведь, вероятно, есть желание сохранить id или, скажем, при INSERT обновлять не все поля, а только те, где есть пересечение.
8. shurik330 - 01 Декабря, 2011 - 12:12:37 - перейти к сообщению
Мелкий пишет:
truncate (или delete всё) + insert
Нет, полностью нельзя удалять все данные из базы
(Добавление)
EuGen пишет:
Мелкий
Не уверен, что в общем случае это отвечает логике. Ведь, вероятно, есть желание сохранить id или, скажем, при INSERT обновлять не все поля, а только те, где есть пересечение.
Не уверен, что в общем случае это отвечает логике. Ведь, вероятно, есть желание сохранить id или, скажем, при INSERT обновлять не все поля, а только те, где есть пересечение.
Но все таки можно как-то реализовать?
9. EuGen - 01 Декабря, 2011 - 12:28:58 - перейти к сообщению
Можно. Есть два способа решения. Первый - выгрузить все ключи записей из БД в массив, пересечь его с массивом ключей для добавления и удалить из БД то, что не входит во второй массив. Выглядит примерно так:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- {
- $rgDBRecords[]=$rgRow['id'];
- }
- //здесь мы предполагаем, что у нас есть $rgINSERTRecords - массив из id, которые будут в добавляемых записях
- {
- }
Вариант второй - создать временную таблицу, добавить все записи туда и уже потом удалять через JOIN, к примеру. Вот здесь есть пример: http://forum.php.su/topic.php?fo...8&topic=2885