-
Каким образом удалить из таблицы записи-дубли? Если создаю уникальный индекс, то при атоматическом добавлении записей в эту таблицу выходит сообщение о нарушении индекса. Хочется, чтоб никаких сообщений не выдавалось, а запись не добавлялась.
-
>Mery (21.07.09 14:07) ловите и обрабатывайте исключение
-
-
> PEAKTOP (21.07.2009 15:17:02) [2]
Да не должно быть дублей в нормально спроектированой системе.
-
+ О проектировании знаем ? О системах знаем ?
или как обычно - ничего не знаю, но пишу суперпрограммы?
-
как всегда все ТАКИЕ УМНЫЕ, так и блещут своей мудростью, не более того... В моём случае есть таблица1 с датами (поле Date1), привязанными к клиенту (поле MEN1). И есть таблица2, в которую автоматически (при нажатии пользователем на кнопку) вставляются записи с таким же полем с кодом клиента и с датой=Таблица1.Date1+30. Мне нужно исключить появление повторных записей-дублей в таблице2 при повторном нажатии пользоателей на кнопочку формирования записей в таблице2. Вот и вопрос: как исключить эти записи-дубли именно в этом случае? ОЧЕНЬ надеюсь на РЕАЛЬНУЮ помощь. А вот это оставь СОВЕСТЬ ДМ при себе, будь любезен. <или как обычно - ничего не знаю, но пишу суперпрограммы?
-
> Mery (22.07.09 06:40) [5]
> ОЧЕНЬ надеюсь на РЕАЛЬНУЮ помощь
Больше можешь не надеяться.
-
а помощь почитать слабо? о try..except/finally не слышали ничего? стандартная конструкция Object Pascal..ой, изывиняюсь! уже ж Delphi!
-
как конкретно try..except/finally использовать в моём случае? в try добавить запись в таблицу, а как построить условие для исключения?
-
> как построить условие для исключения?
Выясни это сама:
try .. попытка добавления записи .. except on e: Exception do ShowMessage(e.Classname + ' ' + e.message); end;
-
> Мне нужно исключить появление повторных записей-дублей в > таблице2 при повторном нажатии пользоателей на кнопочку > формирования записей в таблице2. Вот и вопрос: как исключить > эти записи-дубли именно в этом случае?
ALTER TABLE "таблица2"
ADD CONSTRAINT "CUNQ_таблица2_NO_DUPL" ("Date1", "MEN1") USING INDEX "INDX_таблица2_NO_DUPL";
ну и EXCEPTION отлавливать на клиенте, соответственно.
-
To Mery Может Вам это подойдет (если я Вас правильно понял)? CREATE TABLE TABLE1
(
DATE1 DATE,
MEN1 INTEGER
);
CREATE TABLE TABLE2
(
DATE2 DATE,
MEN2 INTEGER
); и хранимка для Вашей кнопочки CREATE PROCEDURE PR_NODUPLICATES AS
BEGIN
insert into Table2
(date2, men2)
select
T1.DATE1+30,
T1.MEN1
from
Table1 T1
where
CAST((T1.DATE1+30) as char(10)) || CAST(T1.MEN1 as varchar(18))
not in (select distinct
CAST((T3.DATE2) as char(10)) || CAST(T3.MEN2 as varchar(18))
from
Table2 T3);
END просто такой подход плох на больших объемах: условие Where идет с перегрузкой, Вы можете вообще не дождаться окончания операции. Думаю лучше все-таки пересмотреть рел. модель Базы, а не мучиться с "хромой".
-
> HandBrake
> not in (select distinct
NOT EXISTS(... тогда уж...
-
>HandBrake (22.07.09 12:53) [11]
CAST((T1.DATE1+30) as char(10)) || CAST(T1.MEN1 as varchar(18))
not in (select distinct
CAST((T3.DATE2) as char(10)) || CAST(T3.MEN2 as varchar(18))
from
Table2 T3)
читать про correlated subquery только потом подходить к базе
-
Пообедал. Добрый:).
Уважаемый Кщд, я так понял, Вы о "large cost". Знаю и согласен с Вами: сам и предупредил об этом, хотя, может и объяснил не очень здорово. К базе не подойду, пока не прочитаю все ссылки о correlated subquery :)
Существует способ вычислить вставляемые строки способом отличным от моего в операторе SELECT?
Если Да, приведете код такого SELECTа, буду признателен, а то я чего то торможу.
-
> where > CAST((T1.DATE1+30) as char(10)) || CAST(T1.MEN1 as varchar(18)) > not in (select distinct > CAST((T3.DATE2) as char(10)) || CAST(T3.MEN2 > as varchar(18)) > from > Table2 T3); > ENDС ума сойти ...
CREATE PROCEDURE PR_NODUPLICATES AS
BEGIN
insert into Table2
(date2, men2)
select
T1.DATE1+30,
T1.MEN1
from
Table1 T1
where NOT(EXISTS(SELECT T3.DATE2 FROM TABLE2 T3 WHERE (T3.DATE2 = (T1.DATE1+30)AND(T3.MEN2 = T1.MEN1))));
END
-
:)
-
To PEAKTOP © Спасибо, реально тормознул:)
-
To turbouser___ (22.07.09 15:27) [16] Спасибо! Читать мне не перечитать основы SQL. Даже стыдно... Ладно, зато Урок.
-
Спасибо за ответ. При вызове процедуры из приложения возникает ошибка: при выполненнии insert в таблицу автоматически не генерируется первичный ключ этой таблицы, хотя генератор задан.
|