在我的应用程序中,用户可以向数据库添加一些记录。 我使用的是UniDac 4.6.12组件。
对于自动增量字段,我们使用的是serial
PostgreSQL类型,我不会在我的应用程序中触及此字段的值。
但是,在记录Post
之后,字段的值为0。
另外,我得到0:
Q := dmMain.aqrParts.LastInsertId;
如果我刷新数据集,记录将显示填充的串行字段值,但对于用户来说这是不方便的,因为表有很多记录,并且要获取一些记录才能工作,对于用户来说需要设置很多过滤器。
我使用数据集的这种属性:
object aqrParts: TUniQuery
Connection = psqlConnection
SQL.Strings = (
'SELECT * FROM parts.spareparts'
'LIMIT 200')
SpecificOptions.Strings = (
'PostgreSQL.UnpreparedExecute=True')
BeforePost = aqrPartsBeforePost
AfterPost = aqrPartsAfterPost
Left = 32
Top = 72
object aqrPartsId: TIntegerField
AutoGenerateValue = arAutoInc
FieldName = 'id'
Visible = False
end
...
有可能解决这个问题吗?
答案 0 :(得分:3)
当您使用串行类型创建字段时,PostgreSQL服务器会自动创建一个序列,此序列中的值将用作此字段的默认值
要自动填充Id字段,您可以使用以下两种方式:
1)设置
aqrParts.Options.DefaultValues := True.
在这种情况下,Id字段的默认值将设置为“nextval(''parts.spareparts_seq'':: regclass)”,Id字段将自动填充。
2)设置
aqrParts.SpecificOptions.Values['KeySequence'] := 'spareparts_seq';
aqrParts.SpecificOptions.Values['SequenceMode'] := 'smInsert';
在这种情况下,字段Id将从此序列中填充。
答案 1 :(得分:1)
PostgreSQL Sequence Manipulation Functions上的此页面建议您可以在插入之前使用nextval
函数获取身份/自动增量/序列字段的下一个值。因此,您可以首先获得此保证唯一值,然后在用户开始输入任何其他字段值之前将其显示在表单上,最后在insert语句中明确包含此值。
引用nextval
函数
Advance the sequence object to its next value and return that value. This is done atomically: even if multiple sessions execute nextval concurrently, each will safely receive a distinct sequence value.