Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

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

 
vasek ©   (2005-12-10 19:14) [0]

Создал базу данных в 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-10 20:09) [1]

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

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


 
vasek ©   (2005-12-10 23:20) [2]

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


 
vasek ©   (2005-12-10 23:49) [3]

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

 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


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

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
2-1134247378
JazY
2005-12-10 23:42
2005.12.25
Запрос на базе нескольких таблиц в Accesse.


2-1133902863
Конопелька
2005-12-07 00:01
2005.12.25
Hint Message in system tray !


5-1117800518
Priest
2005-06-03 16:08
2005.12.25
Не работает оператор is для класса в Dream Designer


3-1131432001
antoxa2005
2005-11-08 09:40
2005.12.25
Проблема! Если на обном компьютере запись дата сета наход. в реда


2-1133867414
it_work
2005-12-06 14:10
2005.12.25
Отправка сообщения из файла по сети