插入行而不设置主列

时间:2010-10-27 14:27:06

标签: insert firebird

我有这个问题:

INSERT INTO GOST (ASSORTMENTID, ROZMIAR, GOST) 
VALUES ( 54,'S','MjgwMzktODkgMTc0LTk2') 

我想在表GOST中插入新行,但我不想指定带主键的列 - GOSTID。我希望该数据库设置下一个id值。 当我运行此代码时,我有错误:

  

列GOSTID的验证错误,值“ * null *

据我所知,我应该在INSERT查询中设置GOSTID列,是吗?

可以在没有此参数的情况下运行它吗?

3 个答案:

答案 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)可以自动创建触发器和生成器。