我有这个问题:
INSERT INTO GOST (ASSORTMENTID, ROZMIAR, GOST)
VALUES ( 54,'S','MjgwMzktODkgMTc0LTk2')
我想在表GOST中插入新行,但我不想指定带主键的列 - GOSTID。我希望该数据库设置下一个id值。 当我运行此代码时,我有错误:
列GOSTID的验证错误,值“ * null * ”
据我所知,我应该在INSERT查询中设置GOSTID列,是吗?
可以在没有此参数的情况下运行它吗?
答案 0 :(得分:3)
我认为一个样本脚本价值超过1000字:
转到firebird服务器计算机的shell界面,cd到你有读/写权限的文件夹,启动isql或isql-fb(取决于你的系统和firebird版本)并运行这个脚本:
create database 'netmajor.fdb' user 'sysdba' password 'masterkey';
set autoddl off;
create table netmajor_example (
netmajor_id integer not null
, str_data varchar(200)
, int_data integer
, constraint pk_netmajor_example
primary key (netmajor_id)
);
create generator netmajor_gen;
set term ^;
create trigger netmajor_pkassign
for netmajor_example
active before insert position 1
AS
begin
if (new.netmajor_id is null) then
new.netmajor_id = gen_id(netmajor_gen, 1);
end
^
commit work^
set term ; ^
insert into netmajor_example (str_data, int_data) values ('one', 1);
insert into netmajor_example (str_data, int_data) values ('twenty', 20);
commit work;
select * from netmajor_example;
看一下我的机器中的结果:
; NETMAJOR_ID STR_DATA INT_DATA
;============ ============================ ============
; 1 one 1
; 2 twenty 20
如果您有任何疑问,请随时联系。最好的问候。
答案 1 :(得分:1)
显然,您的主键是 NOT NULL 列,这意味着,它始终是必需的。您不能插入行而不提供主键值(除非它是由数据库系统自动设置的“自动编号”列。)
答案 2 :(得分:0)
使用“insert in before”触发器设置主键的值。 Firebird没有“自动增量”字段类型,因此您需要自己处理它。
有关如何执行此操作的教程,请参阅http://www.firebirdfaq.org/faq29/。某些DB应用程序(例如Database Workbench)可以自动创建触发器和生成器。