2011-12-13 86 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 

這是所有

相關問題