2011-12-13 84 views

回答

2

没有可靠的方法来获取“最后一行插入”,除非表中有一个存储该信息的时间戳字段(插入时间戳)。

如果表使用由序列生成的整数PK(Firebird术语中的生成器),那么您可以查询最高PK值,但这也不可靠。

+0

不是我的数据库中的每个表都使用整数主键。我可以通过rdb $获取所有表名(名称列表)。我不知道如何构建查询每个这些名称来查找最大(id)。 – v0latile

+0

这是不可能找到最后插入的行没有代理ID自动增量字段,也没有使用触发器来记录插入 – rstrelba

1

没有'插入最后一行'的概念。其他事务的可见性和可用性取决于提交时间,指定的事务隔离等。即使使用ain建议的生成器或时间戳也不会真正有助于解决此问题。

也许你更好的指定你正试图解决的实际问题。

+0

我会尽力解释我的问题。我有db中的表(id,someval,someval2等)。另外我有一个autoincrement id字段的生成器。当我插入新的记录没有预定义的ID(工程GEN_ID())一切正常。当我用可选(随机)ID(例如导出一些数据)插入记录时,它也可以工作,但是当我尝试在此之后插入下一条记录时 - 我收到访问冲突错误。这就是为什么我需要从发生器和最后一次插入控制ID值。也许我需要在我的自动增量方法中做一些修复? – v0latile

+0

我假设你的意思是一个唯一/主键约束冲突,而不是一个访问冲突,否则就是一个错误。无论如何:确保只有一种方法:始终使用生成器值。如果您需要该值,请查看[INSERT ... RETURNING](http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25-insert.html#langrefupd25-insert-returning) –

0
SELECT GEN_ID(ID_HEDER,0)+1 FROM ANY_TABLE INTO :ID; 
INSERT INTO INVOICE_HEADER (No,Date_of,Etc) VALUES ('122','2013-10-20','Any text') 
/* ID record of INVOICE_HEADER table gets the ID_number from the generator above. So 
    now we have to check if the ID =GEN_ID(ID_HEADER,0) */ 
IF (ID=GEN_ID(ID_HEADER,0)) THEN 
BEGIN 
    INSERT INTO INVOICE_FOOTER (RELACION_ID, TEXT, Etc) Values (ID, 'Text', Etc); 
END 
ELSE 
    REVERT TRANSACTION 

这是所有

相关问题