Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создал базу данных в IBExpert. В базе данных 3-и таблицы: [D7]


vasek ©   (2005-12-10 19:14:00) 

Создал базу данных в IBExpert. В базе данных 3-и таблицы:

SET SQL DIALECT 3;
SET NAMES WIN1251;

CREATE TABLE TABLE_1 (
   INT_F_PK  INTEGER NOT NULL,
   CHR_F     CHAR(10) NOT NULL

ALTER TABLE TABLE_1 ADD CONSTRAINT PK_TABLE_1 PRIMARY KEY (INT_F_PK);

SET SQL DIALECT 3;

SET NAMES WIN1251;

CREATE TABLE TABLE_2 (
   INT_1_F_PK  INTEGER NOT NULL,
   INT_2_F     INTEGER NOT NULL
);

ALTER TABLE TABLE_2 ADD CONSTRAINT PK_TABLE_2 PRIMARY KEY (INT_1_F_PK);

create view new_view ( F1, F2, F3 )
as
select Table_1.int_f_pk, table_1.chr_f, table_2.int_2_f from table_1, table_2
where table_2.int_2_f > 10

хочу заполнить сначала одну из таблиц данными. для этого создаю в делфи проект - форма - на
форме IBDatabase1, IBTransaction1, IBDataSet1, DataSource1, Button1

В IBDataSet1 -

selectSQL -> select * from TABLE_1

modifySQL -> update TABLE_1
set
 CHR_F = :CHR_F,
 INT_F_PK = :INT_F_PK
where
 CHR_F = :OLD_CHR_F and
 INT_F_PK = :OLD_INT_F_PK

insertSQL -> insert into TABLE_1
 (CHR_F, INT_F_PK)
values
 (:CHR_F, :INT_F_PK)

deleteSQL -> delete from TABLE_1
where
  CHR_F = :OLD_CHR_F and
  INT_F_PK = :OLD_INT_F_PK

refreshSql -> Select
 INT_F_PK,
 CHR_F
from TABLE_1
where
 CHR_F = :CHR_F and
 INT_F_PK = :INT_F_PK

обработал клик:
procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
begin
 Randomize;
 for i:=1 to 10 do
   begin
     with IBDataSet1 do begin
       Insert;
       FieldByName('INT_F_PK').AsInteger:= Random(1);
       FieldByName('CHR_F').AsString:= IntToStr(Random(10));
       Post;
     end;
   end;

end;

в итоге ошибка: Project Project1.exe raised exeption class EIBInterBaseError with message
'violation of PRIMARY or UNIQUE KEY constaint "PK_TABLE_1" on table "TABLE_1"'. Process stopped.

что делать?

резюме: в принципе я хотел создать в базе 3-и таблицы и одну из них заполнить,
       вот собственно и все :(.


Сайбель Алексей   (2005-12-11 00:05:00) [1]

2 vasek ©
Для своего первого примера ты можешь просто заполнить INT_F_PK уникальными значениями, допустим i из цикла for.

[3]
А попробовать? :O)
В тригере можно добавить проверку
IF (NEW.INT_F_PK IS NULL) THEN
...

Вообще тебе IBExpert может тебе сам сгенерить код тригера и генератора, если в свойствах поля укажешь автоинкрементируемость:O)

а у IBDataSet смотри GeneratorField
в нем укажешь какой использовать генератор, к какому полю, на сколько инкрементировать и когда.


vasek   (2005-12-10 23:49:00) [2]

генератор такой? :

 Create Generator INT_F_PK_Gen
 Set Generator INT_F_PK_Gen to 0

тригер такой? :

as
 begin
   new.INT_F_PK=gen_id(INT_F_PK_Gen, 1)
 end


vasek   (2005-12-10 23:20:00) [3]

если можно, более детально... у IBDataSet есть свойство, которое позволяет использовать генераторы для создания уникальных ключей... а с тригером как работать, его нужно создать, учитывая высшепреведенный код как он должен выглядеть?


Сайбель Алексей   (2005-12-10 20:09:00) [4]

Ошибка возникает потому что ты своему Уникальному ключу
присваешь значения Random(1) (что кстати всегда 0).

Используй связку Триггер + Генератор для создания автоинкрементируемого поля.


Наверх

Титульная страница Поиск, карта сайта Написать письмо