![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создал базу данных в 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).
Используй связку Триггер + Генератор для создания автоинкрементируемого поля.