2011-12-06 27 views
0

我使用此代碼並在之後創建了一個觸發函數。如果已經有在條目數(ENO)字段的值,但不若字段爲空爲特定表上的每個插入自動增加條目號

CREATE OR REPLACE FUNCTION eno_inc() RETURNS TRIGGER AS $eno_inc$ 
DECLARE 
enmb INTEGER; 
BEGIN 
select max(eno) into enmb from entry; 
new.eno := enmb + 1; 
return new; 
END; 
$eno_inc$ 
LANGUAGE plpgsql; 

我該如何解決這個問題,它工作正常? PS我不能用「串聯」或「序列」,因爲課程的組織者希望該功能

+1

我想你忽略了一些重要的東西在這裏,因爲你的意見不同答案似乎沒有適當地加起來。你可以擴展這個問題嗎? – Yamikuronue

回答

1

所以,你想要什麼觸發專門的行爲,只有在特定情況下火災時,領域爲空

來表述這種方式,你已經基本上回答了自己的問題:

CASE WHEN enmb IS NULL THEN new.eno := 1; 
    ELSE new.eno := enmb + 1; 
    END CASE 
+0

在「WHEN」處或附近產生語法錯誤 –

+0

我自己不使用postgresql;我想我發現了這個問題。調整。 – Yamikuronue

+0

仍然給出語法錯誤**語法錯誤在「ELSE」處或附近** –

0

使用COALESCE(這是標準SQL):

COALESCE函數返回第一個它的參數是不爲空。僅當所有參數都爲空時才返回空值。

所以這樣的事情應該給你enmb爲零時entry是空的,而不是當前的NULL:

select coalesce(max(eno), 0) into enmb from entry; 
+0

仍然在列「eno」中生成錯誤消息**空值違反非空約束** –

+0

@MahonixHonix這聽起來像是數據庫的問題。首先將「eno」聲明爲NOT NULL嗎? – Yamikuronue

+0

@Mahonix:適合我(對,我甚至試過)。你到底在做什麼?你在你的觸發器功能中使用了那個SELECT嗎?你有沒有在觸發器上附加'create trigger ...在插入條目之前...'? –

相關問題