Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.08.2015
Сообщений: 5
1

Исключение дубликатов при записи в базу данных

22.08.2015, 19:28. Показов 2669. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как исключить дубликаты при записи в базу данных! Нужно повторяющиеся данные перезаписывать или пропускать. Если использую insert ignore into, появляется ошибка. Уникальный ключ по [iData].Подскажите, пожалуйста, очень нужно!
Delphi
1
2
3
Q.SQL.Add(‘insert into[Tabl].[Produkt]);
Q.SQL.Add(([iData],[Summa]));
Q.SQL.Add(‘values (CONVERT(DTATIME,’’’+nDate+’’’,102),+nSumma+));
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2015, 19:28
Ответы с готовыми решениями:

Непонятное исключение при вставке в базу данных
Проблема заключается в следующем, вылазит при попытке вставки в БД, используя MS SQL 2008 Express,...

Ошибка при записи в базу данных
Гдето не допонимаю объясните сильно не ругайтесь я новичок в делфи procedure...

Ошибка при добавлении записи в базу данных
При добавлении записи в базу возникает ошибка. Помогите разобраться. const String ConnStr =...

Проблема при добавлении записи в базу данных
Здравствуйте! Помогите разобраться со следующей проблемой: Пытаюсь добавить в базу запись...

7
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
23.08.2015, 01:03 2
Цитата Сообщение от 1412 Посмотреть сообщение
Как исключить дубликаты при записи в базу данных! Нужно повторяющиеся данные перезаписывать или пропускать.
SQL не настолько умный, чтобы при "insert into" сначала проверять есть ли уже запись с таким ключом. Проверяй сам перед внесением данных в БД.
1
4 / 4 / 1
Регистрация: 15.11.2014
Сообщений: 53
23.08.2015, 08:21 3
не работает уникальный ключ. Надо посмотреть, почему.
1
0 / 0 / 0
Регистрация: 15.08.2015
Сообщений: 5
23.08.2015, 08:54  [ТС] 4
А как правельно сделать проверку?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ('values (CONVERT(DTATIME,’’’+nDate+’’’,102')<>[iData]
then 
begin
Q.SQL.Add(‘insert into[Tabl].[Produkt]);
Q.SQL.Add(([iData],[Summa]));
Q.SQL.Add(‘values (CONVERT(DTATIME,’’’+nDate+’’’,102),+nSumma+));
end
else
begin
Q.SQL.Add(‘UPDATE[Tabl].[Produkt]);
Q.SQL.Add(([iData],[Summa]));
Q.SQL.Add(SET [iData]=(CONVERT(DTATIME,’’’+nDate+’’’,102),
[Summa]=+nSumma+’’);
end;
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
23.08.2015, 14:11 5
Цитата Сообщение от northener Посмотреть сообщение
SQL не настолько умный, чтобы при "insert into" сначала проверять есть ли уже запись с таким ключом. Проверяй сам перед внесением данных в БД.
Ехх друг SQL умный и очень умный ! Но, его надо изучать ! что пользоваться его грамотно . Ладно по делу
Цитата Сообщение от 1412 Посмотреть сообщение
Как исключить дубликаты при записи в базу данных!
1) Проверка на уровне СУБД
2) из приложения делаем INSERT
3) А там триггер проверяет если есть такой запись то Rollback tran

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create database DB1;
----------------
use DB1
----------------------
create table Tab1(t_id int identity(1,1),
                  t_name nvarchar(30)
                  )
-----------------------
--drop table Tab2
create table Tab2(t_id int,
                  t_name nvarchar(30)
                  )
----------------------
insert into Tab1(t_name) values(N'Чай');
insert into Tab1(t_name) values(N'Кофе');
insert into Tab1(t_name) values(N'Сахар');
T-SQL
1
2
3
4
5
6
7
8
9
10
/*Триггер проверяеть при инсерте из Tab1 на Tab2 ! Если есть такой запись уже на Tab2 НЕ встравляем ROLLBACK TRAN */
ALTER TRIGGER TR_INSERT_COUNT
ON Tab2
AFTER INSERT
AS
IF (SELECT COUNT (*) FROM Tab2 T, inserted I WHERE T.t_id=I.t_id)>1
BEGIN
ROLLBACK TRANSACTION
 RAISERROR(N'Ест тако запись уже Tab2', 16, 1)
END
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
begin
 if Application.MessageBox(PChar('Вы действительно хотите это запись вставить на Tab2 ?  :  '+
  MSQuery1.FieldByName('t_name').AsString ), 'Предупреждение !!!', MB_ICONWARNING+MB_YESNO)=IDYES then
 begin
  with msqryINSERT do   // Начинаю INSERT
  begin
    SQL.Clear;
    SQL.Text := ' INSERT Tab2 (t_id, t_name)  '+
                ' SELECT t_id, t_name         '+
                ' FROM Tab1                   '+
                ' WHERE Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +'';  // тоько те запись где курсор стаит
    ExecSQL;
    MSQuery2.Refresh;
  end;
end;
end;
 
end.
Добавлено через 1 час 3 минуты
Цитата Сообщение от vfp5 Посмотреть сообщение
не работает уникальный ключ. Надо посмотреть, почему.
Причем тут "уникальный ключ" и как вы хотите что он работал ?

Добавлено через 2 минуты
Цитата Сообщение от 1412 Посмотреть сообщение
А как правельно сделать проверку?
Не правильны поиптка
1
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
24.08.2015, 01:04 6
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Ехх друг SQL умный и очень умный ! Но, его надо изучать ! что пользоваться его грамотно . Ладно по делу
Так это ты, друже не про SQL говорил. Правильно говорил, но не об самом языке SQL А про грамотное создание БД..
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
24.08.2015, 02:19 7
Цитата Сообщение от northener Посмотреть сообщение
Так это ты, друже не про SQL говорил.
Почему , Про SQL тоже говорил смотри так тоже можно проверить да ?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
procedure TForm1.Button1Click(Sender: TObject);
begin
 if Application.MessageBox(PChar('Вы действительно хотите это запись вставить на Tab2 ?  :  '+
  MSQuery1.FieldByName('t_name').AsString ), 'Предупреждение !!!', MB_ICONWARNING+MB_YESNO)=IDYES then
 begin
 with msqryINSERT do
 begin
   SQL.Text := ' select *  '+
               ' from Tab1 inner join Tab2  '+ // Здесь    JOIN
               ' on Tab1.t_id=Tab2.t_id     '+
               ' and Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +''; // Вот здесь на каком записе есть курсор
   Open;
 end ;
 
 if msqryINSERT.RecordCount<>0 then   // А здесь если есть такой запись на Tab2 тоже  RecordCount не будет "0"
 begin
   ShowMessage('Такой запись уже есть на Tab2'); //
 end
 else
 if msqryINSERT.RecordCount=0  then  // А если Tab2 нету такой запись , тогда  RecordCount будет "0" да ?
  with msqryINSERT do   // Начинаю INSERT
  begin
    SQL.Clear;
    SQL.Text := ' INSERT Tab2 (t_id, t_name)  '+
                ' SELECT t_id, t_name         '+
                ' FROM Tab1                   '+
                ' WHERE Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +'';  // тоько те запись где курсор стаит
    ExecSQL;
    MSQuery2.Refresh;
  end;
end;
end;
end.
Цитата Сообщение от northener Посмотреть сообщение
А про грамотное создание БД..
Да
1
0 / 0 / 0
Регистрация: 15.08.2015
Сообщений: 5
24.08.2015, 16:26  [ТС] 8
Когда заношу данные в базу из небольшой таблицы Excel, c количеством строк примерно до 900, записываются нормально. Но если строк больше, до 8000 в базу ничего не импортируется. В чем может быть причина?
0
24.08.2015, 16:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2015, 16:26
Помогаю со студенческими работами здесь

Фантастическая ошибка при записи в базу данных PostgreSQL
Фантастичность ошибки записи, что идет раздвоение через if. Одна ветвь при одном значении, другая...

Добавление записи в базу данных при клике на ссылку
Всем привет, при разработке модуля столкнулась вот с такой проблемой: мне необходимо чтобы по клике...

Исключение EOleError. Как перехватить при удалении записи это исключение ?
Добрый день, Господа. Связал ключем справочник с майн-таблицей на уровне СУБД MySQL. При...

Добавление записи в базу данных при клике на ссылку. Ajax
Всем привет, при разработке модуля столкнулась вот с такой проблемой: мне необходимо чтобы по клике...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru