Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / INSERT and UPDATE / 11 сообщений из 11, страница 1 из 1
01.02.2005, 16:02
    #32895041
_grifon_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
Такой вопрос: есть таблица. С некоторой периодичностью данные в этой таблице должны обновляться. При этом могут появиться дополнительные строки, т.е. использование только оператора UPDATE не допустимо.
Подскажите как правильно реализовать эту систему?

1. SELECT * FROM table 1 WHERE col='значение'
2. проверка на то, успешна была выборка или нет
3. в зависимости от проверки выполнять или INSERT или UPDATE

Или есть все-таки более рациональные варианты?
...
Рейтинг: 0 / 0
01.02.2005, 16:09
    #32895054
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
Как я понимаю, зависит от БД. Например, в Oracle 8 выглядело так (PL/SQL)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT COUNT(*)
INTO cnt1
FROM table1
WHERE col = <val1>;

if cnt1 =  0  then
  INSERT ...
else
  UPDATE ...
end if;

В Oracle 9 появилась команда MERGE, которая делает это с пом. только SQL
...
Рейтинг: 0 / 0
01.02.2005, 16:16
    #32895079
Dogen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
_grifon_Такой вопрос: есть таблица. С некоторой периодичностью данные в этой таблице должны обновляться. При этом могут появиться дополнительные строки, т.е. использование только оператора UPDATE не допустимо.
Подскажите как правильно реализовать эту систему?

1. SELECT * FROM table 1 WHERE col='значение'
2. проверка на то, успешна была выборка или нет
3. в зависимости от проверки выполнять или INSERT или UPDATE

Или есть все-таки более рациональные варианты?
А что такого сложного. Обычно эти insert и update довольно сильно отличаются.
...
Рейтинг: 0 / 0
01.02.2005, 16:18
    #32895091
_grifon_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
Да, прошу прощения забыл сказать про БД: используется MySQL.
...
Рейтинг: 0 / 0
01.02.2005, 16:21
    #32895107
_grifon_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
Dogen
А что такого сложного. Обычно эти insert и update довольно сильно отличаются.

Абсолютно ничего сложного нет. Просто хочется узнать единственный ли способ обновления таблицы, который я написал, или все-таки существуют ещё.
...
Рейтинг: 0 / 0
01.02.2005, 16:24
    #32895121
Dogen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
_grifon_ Dogen
А что такого сложного. Обычно эти insert и update довольно сильно отличаются.

Абсолютно ничего сложного нет. Просто хочется узнать единственный ли способ обновления таблицы, который я написал, или все-таки существуют ещё.
Не единственный.
Используйте только INSERT, а активную версию записи выбирайте по дате или еще как-нибудь.
...
Рейтинг: 0 / 0
01.02.2005, 16:33
    #32895161
Va1entin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
IMHO первоначальный - самый оптимальный вариант.
...
Рейтинг: 0 / 0
01.02.2005, 16:37
    #32895171
_grifon_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
Dogen
Не единственный.
Используйте только INSERT, а активную версию записи выбирайте по дате или еще как-нибудь.

Я думаю засорять таблицу лишними записями не имеет смысла. Но спасибо за вариант :)
...
Рейтинг: 0 / 0
01.02.2005, 16:40
    #32895184
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
tru55Как я понимаю, зависит от БД. Например, в Oracle 8 выглядело так
Зависит. В ASA можно сделать так:
Код: plaintext
1.
2.
3.
INSERT INTO ....
  ON EXISTING UPDATE
VALUES(...)
...
Рейтинг: 0 / 0
01.02.2005, 16:41
    #32895192
Dogen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
_grifon_ Dogen
Не единственный.
Используйте только INSERT, а активную версию записи выбирайте по дате или еще как-нибудь.

Я думаю засорять таблицу лишними записями не имеет смысла. Но спасибо за вариант :)
Я не предлагаю хранить лишнее. Если Вам не нужно хранить версии записей, используйте Ваш вариант.
...
Рейтинг: 0 / 0
01.02.2005, 19:43
    #32895700
PVP
PVP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT and UPDATE
Допустим, что новые записи находятся в TMP, а старые в TABLE. Имеется ключ, определяющий однозначную связь между записью из TMP и TABLE->Key.
Имеется признак в TABLE, который ограничивает множество записей, которому соответствует набор в TMP.

Если время не критично, то проще всего удалить сначала из Table те записи, множество которых относится к обновлению, и затем вставить из TMP в TABLE. Это также исключает возможность остаться старой записи, которая была удалена (в этом случае только Insert или Update недостаточно.

Если критично время, тогда следует позаботиться о том, что бы не было лишней работы для перестрйки индексов и записей в журнал транзакций. Для индексов - не делать Update для тех записей, в которых не поменялись ключевые поля, т.е. входящие в индексы. Для журнала транзакций - не делать Update для тех записей, которые вообще не поменялись.

В целом можно это сделать за несколько шагов
- Отметить в TMP полностью сопадающие записи (отметка в TMP не занимает время)
- Обновить записи с совпадающими ключевыми полями (индексы не меняются, время на запись в журнал транзакций)
- удалить из TABLE записи, для которых соответствующих ключей в TMP
- Вставить из TMP в TABLE не использованные записи из TMP
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / INSERT and UPDATE / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]