【问题标题】:Insert or Append registers when field has Default Value in a TQuery当 TQuery 中的字段具有默认值时插入或附加寄存器
【发布时间】:2026-02-05 02:00:02
【问题描述】:

我想在查询中插入或追加,该查询在数据库中有具有默认值的列,但是当 Delphi 包含寄存器时未设置此列。

我想改变我的附加和插入子句,而是删除具有默认值且为空的字段,但我不知道这是否是简单的方法。

我的桌子是:

创建表 TABLETEST ( ID 整数非空, 字段整数默认值 10 );

我的 Delphi 代码看看是否插入了正确的值是:

Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM TableTest order by ID');
Query1.Open;
Query1.Last;
ID := Query1.FieldByName('ID').AsInteger;

inc(ID);
Query1.Insert;
Query1.FieldByName('ID').AsInteger := ID;
Query1.Post;

inc(ID);
Query1.Append;
Query1.FieldByName('ID').AsInteger := ID;
Query1.Post;

Query1.ApplyUpdates;
Query1.CommitUpdates;

** TQuery 中的 Query1

【问题讨论】:

  • 当我在查询中进行插入或追加,并进行发布时。
  • register,我猜你的意思是auto-incremented value。在这种情况下,您不会在代码中分配一个; INSERT 完成后,数据库将为您分配它。根据您使用的 RDBMS,您通常可以在完成后从数据库中检索值,但我无法提供有关如何执行此操作的建议,因为您没有包含您正在使用的 DBMS 的标签使用。
  • @KenWhite 从他的评论中我相信他说“注册”是指填写插入或附加后跟一个帖子,在这种情况下,他填写“ID”字段,而不是“FIELD”字段,但收到 NULLS 而不是默认值 10
  • @JasperSchellingerhout:如果这就是他的意思,那么这就是问题应该问的。但是,我不确定,而且我不会花时间回答一个问题,只是为了被告知这不是本意。 (无论哪种方式,我都可以很容易地回答这个问题,但要等到发帖人明确提出要问的问题。)
  • 也许这取决于数据库,但是如果插入查询,Firebird 会将NULL 分配给具有默认值的字段(请注意insertappendSQL 中是相同的,AFAIK ) 明确表示,例如insert into table (columnA, columnB) values (10, NULL)。我不知道TQuery 的行为如何,但这可能就是为什么您没有在FIELD 中获得预期的默认值。

标签: sql delphi insert append insert-update


【解决方案1】:

你没有指定使用的SQL Server,但正如GabrielF所说的

执行时用于 Firebird

插入表(columnA,columnB)值(10,NULL)

columnB 的值将是NULL,无论在数据库中默认设置为 10。

为确保默认设置字段值,您可以使用 TQuery OnNewRecord 事件作为:

procedure TDataModule1.Newrecord(DataSet: TDataSet);
begin
  Query1.FieldByName('FIELD').AsInteger := 10; //SET DEFAULT
end; 

或者,如果您想在 Delphi 中使用“纯”SQL(如在 IbExpert 脚本执行程序中),您可以使用:

Query1.Sql.Text := 'Insert into table (ID) values (<value>)';
Query1.ExecSql;

在这种情况下,字段“FIELD”中将没有值,将使用默认值。

【讨论】:

  • 但是当我执行时:插入表(columnA)值(10)columnB的值将是默认值。
  • Query1.insert 将触发 OnNewRecord 事件,因此当您执行 FIELD 时,值将是 10
  • 你也可以设置FIELD INTEGER NOT_NULL DEFAULT 10来测试delphi发送到数据库的内容,或者更好的可以使用SqlMonitor
  • 对不起,我读得不好。是的,如果你执行insert into table (columnA) values (10),就会有columnB的默认值。
  • -1。这并不能解决问题。使用此解决方案,您根本不使用列默认值。您只是在客户端输入一些值(并明确覆盖一个值)。
最近更新 更多