2013-07-23 97 views
4

我試圖通過CLI中的psql將新用戶插入到我們的數據庫中。當我做到以下幾點:Postgres沒有正確返回lastval()

START TRANSACTION; 
INSERT INTO "users" ("email", "first_name", "last_name", "password", "objectstate_id", "activate_rid") 
VALUES ('[email protected]', 'Xpress', 'Care', 'f9fecdd84ee071806423adf30d6d6ff04e1a0a2c6688f2c057ddbab1d6b55d02', 4, 'EMQHTMMvViAB5BdYj0E6'); 
SELECT LASTVAL(); 

LASTVAL總是返回39037,這在技術上應該是838。它也沒有將其插入到數據庫的某些原因。我用Google搜索了一切,我可以想到,並沒有得到任何答案。有誰知道這裏發生了什麼?

+0

什麼是_CLI_? –

+0

命令行界面 - 終端 – benniemosher

+3

您是否在用戶表上定義了任何觸發器或規則?其中之一可能會導致插入失敗。這也可能是另一次調用'nextval()',因此導致你使用'lastval()'給你一個意想不到的答案。 – qqx

回答

9

這裏的簡短版本是使用不合格lastval是一個壞主意。觸發器,規則等可能會導致問題。

您應完全避免lastval。使用方法:

BEGIN; 

INSERT INTO "users" ("email", "first_name", "last_name", "password", "objectstate_id", "activate_rid") 
VALUES ('[email protected]', 'Xpress', 'Care', 'f9fecdd84ee071806423adf30d6d6ff04e1a0a2c6688f2c057ddbab1d6b55d02', 4, 'EMQHTMMvViAB5BdYj0E6') 
RETURNING id; 

其中id應該是由生成的密鑰列的名稱。

該方法將正確處理多值插入和INSERT INTO ... SELECT ...,並且不會觸發觸發序列的問題。

如果您必須使用基於函數調用的方法,至少使用currval('tablename_id_seq')(傳遞適當的序列名稱)而不是lastval