Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.07.2015, 12:07   #1
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию Как очистить базу данных?

Чтобы удалить одну запись, использую просто ADOQuery1.Delete. Какой командой можно удалить все записи сразу?
Dux вне форума
Старый 11.07.2015, 12:31   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от Dux Посмотреть сообщение
Чтобы удалить одну запись, использую просто ADOQuery1.Delete. Какой командой можно удалить все записи сразу?
Специальной команды для этого у ADOQuery нет. Используйте SQL.
Streletz вне форума
Старый 11.07.2015, 12:40   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от Dux Посмотреть сообщение
Какой командой можно удалить все записи сразу?
Код:
 With ADOQuery1 do
 begin
  Close;
  SQL.Clear;
  SQL.Text := 'DELETE FROM Имя_таблиц ';
  ExecSQL;
 end;
xxbesoxx вне форума
Старый 11.07.2015, 12:53   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Код:
 With ADOQuery1 do
 begin
  Close;
  SQL.Clear;
  SQL.Text := 'DELETE FROM Имя_таблиц ';
  ExecSQL;
 end;
не всегда имя таблицы прописано в ADOQuery1. Там может быть и два, три "энн" имён таблиц.
и ещё, присвоение в SQL.Text очищает текст в TStrings коим является объект SQL в TDataSet. Не распространяйте пожалуйста порочную практику ...кода.
--------------
Автор, если в запросе ADOQuery1 одна таблица, воспользуйтесь кодом от xxbesoxx, он корректен хоть стиль желает лучшего.
Если в ADOQuery1 несколько таблиц, удалению принадлежат только те записи, которые выбираются с базовой таблицы.
В общем случае удаление будет выглядеть во так
Код:
with ADOQuery1 do
begin
  Open;
  DisableControls; //++
  while not IsEmpty do
    Delete;
  EnableControls;//++
  Close;
end;
Код "валит" записи основной таблицы до тех пор, пока ADOQuery1 не станет пустой

+дополнил
и ещё, рекомендую перед началом удаления записей вызывать методы DisableControls; а после окончания EnableControls
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 11.07.2015 в 12:55.
JUDAS вне форума
Старый 11.07.2015, 14:02   #5
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
не всегда имя таблицы прописано в ADOQuery1. Там может быть и два, три "энн" имён таблиц.
Юморист при создание дочерние таблицы есть же онграничения FK и каскадное удаление на все СУБД
Код:
constraint FK_Lpriem foreign key(Lpri_u_id) references users(u_id) ON delete cascade
Если я удаляю на "главное" таблице он не будеть удалять на "дочерние таблицы" ?
Цитата:
и ещё, присвоение в SQL.Text очищает текст в TStrings коим является объект SQL в TDataSet.
Нет. не только "Текст" -всё таблицу , не имеить значения какои там данных в таблице ! А Oracle после "delete from tab" можно писать rollback и транзакция отменяется - все запись возвращается в таблице . Для Oracle можно писать так
Код:
TRUNCATE TABLE имятаблиц;
Ваши код цикл " while not IsEmpty do Delete;" - он же медленный , будеть очень потормазивать !
Код:
и ещё, рекомендую перед началом удаления записей вызывать методы DisableControls;
Повторяю !!! Я вобше не рекомендую для удаление запись применять цикл " while " - пока он перечитаеть все строк . SQL запрос будеть работать 10-раз быстрее

Последний раз редактировалось xxbesoxx; 11.07.2015 в 14:11.
xxbesoxx вне форума
Старый 11.07.2015, 15:05   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
А Oracle после "delete from tab" можно писать rollback и транзакция отменяется - все запись возвращается в таблице . Для Oracle можно писать так
Согласн, с одной поправкой если в TOraDataSet не стоит AutoCommit = true. (о птичках, он там стоит по умолчанию)

Цитата:
Ваши код цикл " while not IsEmpty do Delete;" - он же медленный , будеть очень потормазивать !
Согласен, но вопрос автора темы не в скорости, а "как удалить" .

Цитата:
при создание дочерние таблицы есть же ограничения FK и каскадное удаление на все СУБД
юморист говрите, вот Вам пример (в стиле Oracle на реляционной БД)

структура прототипа БД:

Код:
CREATE TABLE users -- аккануты пользователей
(
   id            integer   primary key,
   name       CHAR (64),
   nick         CHAR (16),
   ....
   и.т.п
)



CREATE TABLE city
(
   id            integer   primary key,
   region      integer REFERENCE city(id) ON DELETE CASCADE on UPDATE SET NULL,
   name       CHAR (64),
   post        CHAR (16)
   ....
   и.т.п
)

CREATE TABLE houses
(
  id                integer   primary key,
  cityID          integer REFERENCE city(id) ON DELETE CASCADE on UPDATE CASCADE,
  street           CHAR (32),
  number         CHAR (8), // допускается 2А 
  objecttype    CHAR (4),
  positionX      decimal(10,8),
  positionY      decimal(10,8),
  heightM        decimal(5,2),
  levels           integer,
  ....
  -- идентификатор пользователя который вводил информацию
  inputUser     integer REFERENCE users(id) ON DELETE SET NULL on UPDATE CASCADE

);
в Выборке TAdoQuery следующий запрос

Код:
SELECT H.id,  C.name, H.street,  H.number,  H.objecttype, U.nick 
FROM 
  houses H, city C, users U
WHERE 
  H.cityID = C.id(+) AND H.inputUser = U.id(+) AND 
   С.name = 'РУСТАВИ' AND H.street like '%ШЕВАРНАД%'
Вопрос по "юмору", с каких таблиц выполнится удаление если выполнить команду TAdoQuery.Delete ?

Вопрос по сути Вашего ответа - что написать в SQL.Text чтобы у автора удалились все записи в TDBGrid(Eh)
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 11.07.2015 в 15:08.
JUDAS вне форума
Старый 11.07.2015, 16:31   #7
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

1) Вы на слову " Юморист " Не обижайтесь пожалуйста , это вполне допустимое реальное общение тоже . там негего такого
2) Про удаление запись
Код:
CREATE TABLE city
(
   id            integer   primary key,
   region      integer REFERENCE city(id) ON DELETE CASCADE on UPDATE SET NULL,
   name       CHAR (64),
   post        CHAR (16)
   ....
   и.т.п
)

CREATE TABLE houses
(
  id              integer   primary key,
  cityID          integer REFERENCE city(id) ON DELETE CASCADE on UPDATE CASCADE,
  street          CHAR (32),
  number          CHAR (8), // допускается 2А 
  objecttype      CHAR (4),
  positionX       decimal(10,8),
  positionY       decimal(10,8),
  heightM         decimal(5,2),
  levels          integer,
  ....
  -- идентификатор пользователя который вводил информацию
  inputUser integer 
  REFERENCE users(id) ON DELETE SET NULL on UPDATE CASCADE

);
В моменте удаление записи city удаляется в таблице houses потому что есть cityID integer REFERENCE city(id) ON DELETE CASCADE on UPDATE CASCADE,

Код:
REFERENCE users(id) ON DELETE SET NULL on UPDATE CASCADE
А это что ? смысл писать ON DELETE SET NULL я не вижу....
Цитата:
в Выборке TAdoQuery следующий запрос

Код:


SELECT H.id, C.name, H.street, H.number, H.objecttype, U.nick
FROM
houses H, city C, users U
WHERE
H.cityID = C.id(+) AND H.inputUser = U.id(+) AND
С.name = 'РУСТАВИ' AND H.street like '%ШЕВАРНАД%'

Вопрос по "юмору", с каких таблиц выполнится удаление если выполнить команду TAdoQuery.Delete ?
Я понял что вы имеете в виду . В таком случае надо писать 2 приложения
1) из который будеть
--Регистрация пользователя
--Резервное копирование и восстановление баз данных
--Удаление запис то или иное таблици ! зависить от сущности
2) Здесь уже для операторов-users
-- Который будеть работать многотабличный запрос-е
-- и все требование который им нужно
Так что если вы имеете в виду ! реализовать все это одном приложение , Я думаю это ошибка проектирования .

Итоге : цикл " while " не советую и для очистка , резервное копирование и восстановление баз данных советую писать отделное приложения

Последний раз редактировалось xxbesoxx; 11.07.2015 в 17:05.
xxbesoxx вне форума
Старый 11.07.2015, 16:38   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не распространяйте пожалуйста порочную практику ...кода.
Чего?? О_о
Это что я сейчас услышал? Очередной гансмок в воздух?
Цитата:
рекомендую перед началом удаления записей вызывать методы DisableControls; а после окончания EnableControls
Это даже комментировать не хочу.
Цитата:
Какой командой можно удалить все записи сразу?
Запрос запросом - это не оспаривается, но есть СУБД типа Фокспро, в которой действительно есть одна команда для очистки. Какую СУБД используешь ты?
I'm learning to live...
Stilet вне форума
Старый 11.07.2015, 17:15   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

я никогда и ни на кого не обижаюсь, а тем более в Интернете.

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Итоге : цикл " while " не советую и для очистка , резервное копирование и восстановление баз данных советую писать отделное приложения
Вот Вы и ответили на главный вопрос авторв - удалять с TAdoQuery всё сразу таким способом как Вы советовали - нельзя, потому что мы не знаем что там внутри TAdoQuery. Там может быть сцепка с 5-ти таблиц, причём две из них могут быть главные (например таблица адресов).
На экране видим "Москва, ул Ленина, д2 кв.4" на на самом деле это может быть выборка с 4-х таблиц причём главная (первая) таблица - город.
Удаляя все в таблице город, мы удалим не только квартиры дома 2 а и все улицы Москвы.

>Очередной гансмок в воздух?
Стилет, речь идёт об этои

Код:
 With ADOQuery1 do
 begin
  Close;
  SQL.Clear;
  SQL.Text := 'DELETE FROM Имя_таблиц ';
  ExecSQL;
 end;
у нас на роботе, некоторые специалисты пишут вообще вот так:

Код:
 With ADOQuery1 do
begin
  Close;
  SQL.Clear;
  SQL.Lines.Add('DELETE FROM Имя_таблиц' ');
  Execute;

  SQL.Clear;
  SQL.Lines.Add('commit');
  Execute;

  SQL.Clear;
  Open;
end;
п.с. руки бы сломал
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума
Старый 11.07.2015, 18:03   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Вот Вы и ответили на главный вопрос авторв - удалять с TAdoQuery всё сразу таким способом как Вы советовали - нельзя, потому что мы не знаем что там внутри TAdoQuery. Там может быть сцепка с 5-ти таблиц
1) Для одного можно ! и будеть работать быстрее чем цикл " while "
2) Для многотабличные данных! если это требуетсия на стороне программу который для операторов-users напишу хранимы процедур типа такого
Код:

CREATE PROCEDURE Proc_name_DELETE

AS

DELETE  
FROM
    customers c
    LEFT OUTER JOIN orders o
        ON C.customer_id = o.customer_id
WHERE
    o.customer_id IS NULL
и через Delphi буду вызвать на выполнение процедуру Proc_name_DELETE зависить от сущности БД !!!! цикл " while not IsEmpty do Delete;" - не буду применять и не советую не кому

Последний раз редактировалось xxbesoxx; 11.07.2015 в 18:08.
xxbesoxx вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста очистить базу сообщений Odinsoon PHP 2 09.10.2014 21:47
AdoQuery и как очистить базу L3zh1Y Помощь студентам 0 16.05.2012 12:50
Как лучше организовать базу данных типо как в ICQ Руслантус БД в Delphi 3 09.08.2008 23:57
Как создать базу данных? LeonKing Помощь студентам 4 07.05.2008 14:11
Как создать базу данных knazty Помощь студентам 15 18.11.2007 19:49