Лена |
Отправлено: 04.12.2006, 11:28 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Как правильно переписать запрос ниже:
UPDATE keys, visitors SET keys.person_id = NULL WHERE person_id =visitors.id
keys и visitors таблицы. Мне надо записать в колонку person_id значение NULL.
|
|
AVC |
Отправлено: 04.12.2006, 11:48 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Если правильно понял
Update key Set person_id = Null
Where person_id in (Select id From visitors)
Еще можно воспользоватья exist
Но если вы не пользуетесь "многосвязным" полем person_id ("многосвязное" это когда для разных записей поле ссылается на разные таблицы) то этот запрос равносилен
Update key Set person_id = Null
Другое дело если вы самих визиторов отбираете еще по какому либо критерию. |
|
Лена |
Отправлено: 04.12.2006, 13:42 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Спасибо! |
|
olegenty |
Отправлено: 04.12.2006, 13:58 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
2 Лена — избегай таких условий при update, либо внимательно вчитывайся в синтаксис update при join
|
|
Лена |
Отправлено: 04.12.2006, 14:43 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Да, вроде разобралась. В моем случае, мне нужно по другому делать:
CODE |
//событие BeforeDelete для ClientDataSetVis
//ADOQueryKey привязан к таблице keys
DataModule2->ADOQueryKey->SQL->Add("Update keys Set person_id = Null Where person_id ="+ IntToStr(DataModule2->ClientDataSetVis->FieldByName("id")->AsInteger));
DataModule2->ADOQueryKey->ExecSQL();
|
В таблице привязанной к ADOQueryKey есть поле person_id. Если удаляется запись из другой таблицы (ClientDataSetVis), то я обнуляю поле person_id в таблице привязанной к ADOQueryKey.
|
|
AVC |
Отправлено: 04.12.2006, 15:06 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
Если удаляется запись из другой таблицы (ClientDataSetVis), то я обнуляю поле person_id в таблице привязанной к ADOQueryKey
|
А что у PostgreSQL это нельзя записать бизнес правилами (ограничениями, тригерами, правилами для FK ...) прямо на сервере?
Классика — restrict / cascade / set null для дочерних таблиц поддерживают редко а вот для родительских почти всегда (если сервер претендует на звание сервера БД ) |
|
Лена |
Отправлено: 04.12.2006, 15:23 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
QUOTE (AVC @ 04.12.2006, 15:06) | QUOTE |
А что у PostgreSQL это нельзя записать бизнес правилами (ограничениями, тригерами, правилами для FK ...) прямо на сервере?
|
|
Да, можно, но я не разробатывала базу. Что либо менять в базе может только другой человек.
Я работаю с готовой базой данных, которую мне дали и этого ограничения там нет, поэтому пришлось через SQL делать. Вроде работает.
Отредактировано Лена — 04.12.2006, 15:25 |
|
olegenty |
Отправлено: 04.12.2006, 16:03 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
в MSSQL вот это:
CODE |
update some_table set
some_field = some_value(some_expression)
from
some_other table
inner join some_very_other table on some_condition
|
тоже работает, только результат непредсказуем, надо очень аккуратно блюсти синтаксис (первой таблицей в join ОБЯЗАНА быть обновляемая таблица. однако MSSQL этого условия не проверяет. я как-то чуть базу не порушил, перепутав view с таблицей в таком выражении, поскольку их названия отличались только префиксом "v" у view)
|
|