![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли вносить изменения... [D7, IB6.x]
PrettyFly © (2003-08-29 14:34:00)
Можно ли как-нибудь вносить изменения в DataSet организованный из двух таблиц, например:
SELECT A.*, B.Name
FROM A INNER JOIN И ON(B.IDA = A.ID)
т.е. так, чтобы и в базе всё правильно менялось?
Bless (2003-09-03 16:19:00) [1]
Всем спасибо.
Reindeer Moss Eater (2003-09-03 16:02:00) [2]
Так почему работает
SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod?
Потому что обновляются поля только одной таблицы.
Danilka (2003-09-03 15:57:00) [3]
Bless (03.09.03 15:46)
Это глюк такой. :))
На самом деле, если ключа нет, то какие-то запросы будут работать. Иногда. :))
Для полноценной работы с сервером ключи нужны обязательно. Почитай Мартина Грубера "Понимание SQL", есть на сайте Анатолия Подгорецкого в вордовском формате:
http://www.podgoretsky.com/
Bless (2003-09-03 15:46:00) [4]
Так почему работает
SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod?
Danilka (2003-09-03 15:43:00) [5]
Bless (03.09.03 15:38)
нет. это определяет тот, кто проектирует таблицы - какие поля у него ключевые, какие нет.
Bless (2003-09-03 15:38:00) [6]
А сам сервер не определяет, какие у таблицы поля ключевые?
Danilka (2003-09-03 12:46:00) [7]
Если в ключе несколько полей, то надо их перечислить через запятую.
Danilka (2003-09-03 12:45:00) [8]
Bless (03.09.03 12:30)
Дело в том, что сервер должен знать, какое поле у него является ключевым.
Для этого тебе надо исполнить скрипт:
alter table ИМЯ_ТАБЛИЦЫ
add constraint ИМЯ_КЛЮЧА
primary key (ИМЯ_КЛЮЧЕВОГО_ПОЛЯ)
Bless (2003-09-03 12:30:00) [9]
Прошу прощения. Я сказал, что добавил ключи. Имел ввиду, что ввел еще одно UNIQUE-поле в каждую таблицу.
Но до введение нового уникального поля у меня и так не было повторяющихся записей, то есть был "набор полей, однозначно идентифицирующих запись", а значит, был ключ!
А не работало для запроса 1) и работало для запроса 2)
( см. [12] )
Но ведь количество строк в обеих случаях одинаково. Просто меньше столбцов!
Если должно работать с ключом (не путать с индексом!), то почему не работает в случае 1)? Ведь ключ есть в обеих таблицах, если понимать под ключом набор полей, однозначно идентифицирующих запись.
Если должно НЕ работать без индекса, то почему работает в случае 2)?
>Reindeer Moss Eater © (03.09.03 10:34) [24]
>Мы на рынке.
>Вы покупаете арбузы (записи) у продавца (сервера) говоря
>продавцу : эй, продавец (SQL сервер), дай мне вон тот круглый
>зеленый арбуз (вон ту запись в таблице). На что продавец (SQL
>сервер) резонно отвечает: они у меня все зеленые и все круглые
>(ключ короче говоря давай).
:) Это, конечно, правильно. Но я понимал под ключом индекс. И потому говорил, что в таблицах нет ключа. В свете нового (для меня ) определения ключа, данного Danilka-ой, говорю: ключ есть. И ситуация с арбузами теперь приблизительно такая:
- Дайте мне вон тот арбуз, третий слева во втором ряду (есть ключ).
- Э, не, дорогой, ты пальцем покажи! (индекс давай).
Если захотите проверить, привожу свои таблицы
t1
-------------------
kod(int) name (char(10))
1 qqq
1 b
2 k
2 b
3 c
3 d
4 e
t2
---------------------
kod(int) ChildKod(int) name(char(10))
2 22 bbb
3 33 c
4 44 d
Индексов нет.
SELECT t1.*, t2.* FROM t1, t2 WHERE t1.kod=t2.kod
- нельзя менять.
SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod
- можно менять.
Reindeer Moss Eater (2003-09-03 10:34:00) [10]
Вот бы еще понять, ПОЧЕМУ без ключей работает не всегда и ПОЧЕМУ работает с ключами...
Мы на рынке.
Вы покупаете арбузы (записи) у продавца (сервера) говоря продавцу : эй, продавец (SQL сервер), дай мне вон тот круглый зеленый арбуз (вон ту запись в таблице). На что продавец (SQL сервер) резонно отвечает: они у меня все зеленые и все круглые (ключ короче говоря давай).
sniknik (2003-09-03 10:21:00) [11]
Bless (03.09.03 09:22) [21]
> Вот бы еще понять...
к тому же с ключом быстрее, даже в том случае запроса когда обновление возможно, роль ключа для идентификации играет тогда вся запись, можеш проверить заведи в редактируемом без ключа запросе 2 абсолютно одинаковые записи, после попробуй изменить одну из них(любое поле) получиш исключение.
так что ключ нужен, даже если вам он не нужен!
Danilka (2003-09-03 10:08:00) [12]
Bless (03.09.03 09:22)
Ключ это не индекс, ключ - это поле или набор полей однозначно идентифицирующие запись.
А проблемы из-за отсутствия ключей, например такие:
Когда ты изменяешь в датасете какую-нибудь запись делается запрос к серверу, типа:
update ИМЯ_ТАБЛИЦЫ
set ИЗМЕНЯЕМОЕ_ПОЛЕ = НОВОЕ_ЗНАЧЕНИЕ
where КЛЮЧЕВОЕ_ПОЛЕ = ЗНАЧЕНИЕ_КЛЮЧА_ИЗМЕНЯЕМОЙ_ЗАПИСИ
а если у тебя нет ключей, какой запрос должен быть по-твоему?
Bless (2003-09-03 09:22:00) [13]
В общем, добавил ключи в таблицу и все заработало.
Вот бы еще понять, ПОЧЕМУ без ключей работает не всегда и ПОЧЕМУ работает с ключами...
HSolo (2003-09-01 15:08:00) [14]
Извините, проморгала, что речь идет уже об MSSQL. FIBPlus - да, это для IB.
А процедуры пишутся средствами SQL-сервера. Имеются в виду хранимые процедуры.
Bless (2003-09-01 14:40:00) [15]
>Зачем же извращаться? Напишите процедуру вставки/обновления,
>вполне себе штатный способ.
А где эти процедуры пишутся? Напоминаю, речь идет об MSSQL и ADO
>Откуда дергать - я пользую FIBPlus,
>там есть для таких вещей TpFIBUpdateObject
Если буквы IB в слове FIBPlus обозначают InterBase, то это не подходит. А если нет - то что это такое и где его взять.
HSolo (2003-09-01 14:26:00) [16]
Зачем же извращаться? Напишите процедуру вставки/обновления, вполне себе штатный способ. Откуда дергать - я пользую FIBPlus, там есть для таких вещей TpFIBUpdateObject
Bless (2003-09-01 12:25:00) [17]
>Помнится мне что было ограничение на набор обновляемых полей.
>Сервер "поймет" какой update надо ему выполнить, если обновляются
>поля из одной таблицы, а не многих.
О, это уже что-то. Спасибо.
Так что, если мне кровь из носу надо обновлять данные из нескольких таблиц, то надо извращаться? А никаких механизмов, облегчающий жизнь вроде RequestLive или UpdateSQL или их аналогов/заменителей нету?
>Что, и первичного ключа нет ? Нехорошо. Черевато аномалиями.
Да это тестовые таблицы по 5 записей в каждой :)
Zacho (2003-09-01 11:56:00) [18]
> Bless (01.09.03 11:38) [14]
> Если под "ключевым" имеется ввиду поле, по которому создан
> индекс, то в таблице t1 таких полей нет
Что, и первичного ключа нет ? Нехорошо. Черевато аномалиями.
Reindeer Moss Eater (2003-09-01 11:53:00) [19]
Из одной наверное. Ведь данные, отображенные в гриде- t1.* -выбираются только из одной таблицы.
Помнится мне что было ограничение на набор обновляемых полей.
Сервер "поймет" какой update надо ему выполнить, если обновляются поля из одной таблицы, а не многих.
Bless (2003-09-01 11:38:00) [20]
>SELECT t1.* - все поля присутствуют, значит и ключевые там есть.
В запросе SELECT t1.*, t2.* тоже все поля присутствуют, а не работает
Может, мы понимаем разные вещи под словом ключевое поле?
Если под "ключевым" имеется ввиду поле, по которому создан индекс, то в таблице t1 таких полей нет.
>Когда "все работает" обновляются поля из обеих таблиц или одной?
Из одной наверное. Ведь данные, отображенные в гриде- t1.* -выбираются только из одной таблицы.