C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
SQL-запрос
artcore
Отправлено: 21.12.2005, 21:39


Не зарегистрирован







В общем что-то не могу понять как сделат следующее:
напрмер таблица:
id |value|
1 a
1 a
2 b
1 a

Вот как удалить одну любую запись при id=1?
olegenty
Отправлено: 22.12.2005, 07:25


Ветеран

Группа: Модератор
Сообщений: 2412



смотря какая СУБД.
idhas
Отправлено: 22.12.2005, 13:30


Ученик-кочегар

Группа: Участник
Сообщений: 17



СУБД MS SQL 2000
Gedeon
Отправлено: 22.12.2005, 15:08


Ветеран

Группа: Модератор
Сообщений: 1742



А никак, нормально базу надо проектировать.
Guest
Отправлено: 22.12.2005, 20:33


Не зарегистрирован







Ну почему, извратившись можно.

Например, удаляем первую из них, но не средставми запроса.

Находите в таблице запись с нужным id |value
встаете на эту запись таблицы (то есть делаете ее текущей)
и Table1->Delete();

Что-то типа (писал не в Builder-e — если есть ошибки исправьте сами)

CODE

Table1->First();
while(!Table1->Eof()){
if(Table1->Fields->Fields[0]->AsString == "1" &&
Table1->Fields->Fields[1]->AsString == "a"){
Table1->Delete(); break;
   }
 Table1->Next();
}


А Gedeon конечно прав: правильно проектируйте базу данных,
иначе потом проблем будет wink.gif ohmy.gif wink.gif выше крыши.

Отредактировано Admin — 22/12/2005, 20:37
olegenty
Отправлено: 23.12.2005, 09:02


Ветеран

Группа: Модератор
Сообщений: 2412



в IB/FB можно, идентификатором записи является также db_key smile.gif)

но табличку надо перепроектировать
AVC
Отправлено: 23.12.2005, 09:14


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Например, удаляем первую из них, но не средставми запроса.

Находите в таблице запись с нужным id |value
встаете на эту запись таблицы (то есть делаете ее текущей)
и Table1->Delete();

Вы пытались это реализоватьl? Подозреваю, что так ни чего не выйдет, так как Table->Delete для SQL'евских баз порождает запрос "Delete where все_поля".
Быстрый тест на MySQL дал ошибку (закономерную) "Multiple records found, but only one was expected."
Такое можно провернуть с Oracl'ом так как он снабжает каждую запись служебным уникальным полем, но это уже из другой оперы.

Есть вариант решения — добавить поле и заполнить его так, что бы записи 1 а отличались друг от друга. Но это и есть, как писал Gedeon, доведение структуры до нормального состояния.
Gedeon
Отправлено: 23.12.2005, 13:12


Ветеран

Группа: Модератор
Сообщений: 1742



Совершенно согласен с AVC я тоже сначала хотел предложить удалять запись на клиенте, но это не возможно.
Есть все-таки способ с созданием временной таблицы, удалением оттуда записи и возвратом записей в первоначальную, но это просто кретинизм.
artcore
Отправлено: 25.12.2005, 15:34


Не зарегистрирован







В принципе да, мой баг, я думал обойдусь без уникального поля, оказалось нет, что ж, переделаем...

Вернуться в Работа с базами данных в C++Builder