用Delphi在Firebird中创建表格和自动增量列

用Delphi在Firebird中创建表格和自动增量列,delphi,firebird,auto-increment,unidac,Delphi,Firebird,Auto Increment,Unidac,我想在Firebird embedded中创建一个表,并为自动递增设置一列,但我不能。我可以创建表,但不能设置自动递增的列 我正在使用: Firebird嵌入式2.5 德尔福xe3 UniDAC组件 我的SQL命令: with UniSQL1 do begin SQL.Text := 'Create TABLE tab1(EMP_NO EMPNO NOT NULL, '+ 'FIRST_NAME "FIRSTNAME" NOT NULL, '+ 'LAST

我想在Firebird embedded中创建一个表,并为自动递增设置一列,但我不能。我可以创建表,但不能设置自动递增的列

我正在使用:
Firebird嵌入式2.5
德尔福xe3
UniDAC组件

我的SQL命令:

with UniSQL1 do
  begin
    SQL.Text := 'Create TABLE tab1(EMP_NO EMPNO NOT NULL, '+
  'FIRST_NAME           "FIRSTNAME" NOT NULL, '+
  'LAST_NAME             "LASTNAME" NOT NULL, '+
  'PHONE_EXT                VARCHAR(     4)  COLLATE NONE, '+
 'PRIMARY KEY (EMP_NO) '+
  '); '+
  'CREATE GENERATOR gen_tab1_EMP_NO; '+
  'SET GENERATOR gen_tab1_EMP_NO TO 0; '+
  'SET TERM !! ; '+
  'CREATE TRIGGER SET_EMP_NO FOR tab1 ACTIVE BEFORE INSERT POSITION 0 AS '+
  'BEGIN '+
      'if (new.emp_no is null) then '+
      'new.emp_no = gen_id(gen_tab1_EMP_NO, 1); '+
  'END !!'+
  'SET TERM ; !!';

    try
       Execute;
       ShowMessage('Table Created');
    except
       ShowMessage('Table Not Created');
    end;
  end;

试试这个,看看哪里会发生错误。您也可以尝试保存脚本并在IBExpert或其他工具上执行,看看是否运行正常

with UniSQL1 do
begin
    SQL.Clear;
    SQL.Add('Create TABLE tab1(');
    SQL.Add(     EMP_NO EMPNO NOT NULL,');
    SQL.Add('    FIRST_NAME "FIRSTNAME" NOT NULL,');
    SQL.Add('    LAST_NAME  "LASTNAME" NOT NULL,');
    SQL.Add('    PHONE_EXT  VARCHAR(4) COLLATE NONE,');
    SQL.Add('    PRIMARY KEY (EMP_NO)');
    SQL.Add(')');
    try
        Execute;
    except
        on E:Exception do
            raise Exception.Create('ERROR 1:' + sLineBreak + E.Message);
    end;

    SQL.Clear;
    SQL.Add('CREATE GENERATOR gen_tab1_EMP_NO;');
    try
        Execute;
    except
        on E:Exception do
            raise Exception.Create('ERROR 2:' + sLineBreak + E.Message);
    end;

    SQL.Clear;
    SQL.Add('SET GENERATOR gen_tab1_EMP_NO TO 0;');
    try
        Execute;
    except
        on E:Exception do
            raise Exception.Create('ERROR 3:' + sLineBreak + E.Message);
    end;

    SQL.Clear;
    SQL.Add('CREATE TRIGGER SET_EMP_NO FOR tab1 ACTIVE BEFORE INSERT POSITION 0 AS');
    SQL.Add('BEGIN');
    SQL.Add('    if (new.emp_no is null) then');
    SQL.Add('        new.emp_no = gen_id(gen_tab1_EMP_NO, 1);');
    SQL.Add('END'
    try
        Execute;
    except
        on E:Exception do
            raise Exception.Create('ERROR 4:' + sLineBreak + E.Message);
    end;
end;

请描述问题,并显示您遇到的任何错误。还请注意,您试图一次执行多个语句:Firebird本身不允许这样做,因此请确保您使用的组件实际支持这一点(即:它将它拆分为单独的语句)。不要忘记在每个语句之后提交,但我不知道您为什么不在数据库级别而不是在delphi代码中运行这些语句,因为这些语句肯定只运行一次。@Fero68没有必要在每个DDL语句之后提交,就在整个工作单元之后。@如果您将语句包装在终止符(集合项)周围,请标记您是对的@Fero68我认为我们讨论的是不同的事情,因为即使是这样也没有必要(
SET TERM
实际上不是Firebird server可以识别的东西,因此这纯粹是特定于工具的)。