2013-11-27 31 views
0

我想遞增一個沒有順序的字段。有沒有可能? 我可以做這樣的事情在ORACLE中自動遞增一個沒有順序的字段

INSERT INTO Test 
VALUES ((
     SELECT COUNT(ID) 
     FROM Test)+1) 

請給我建議的方式來做到這一點

+5

「*我正在嘗試增加沒有序列的字段*」。爲什麼你會想要這樣做?在多用戶環境中,使用'max()'(或者更糟糕的情況是'count()')要麼很慢,要麼不可擴展,要麼是錯誤的。 –

+2

在多用戶環境中,沒有可擴展的可能性。原因是ACID - 您的會話無法看到來自其他會話的未完成數據。這也適用於最大值計算。順便說一句:最新版本的Oracle 12c已經實現了自動增量。 – ibre5041

+1

你能解釋爲什麼你不想使用序列嗎? –

回答

1

如果您的序列字段被稱爲seq_fld,例如,您可以使用

insert into Test values ((select max(seq_fld) from Test) + 1) 

建議對seq_fld具有唯一約束

+0

但是如果它是第一個記錄,它會拋出NULL。所以我想最好使用COUNT而不是MAX。你怎麼看? –

+0

如果我們拋開事實這並不是在多用戶環境中實現列值遞增的正確方法,那麼如果我們將insert插入到...值(...)中,那麼該查詢仍然會產生不正確的結果。語句'insert into .. select .. from..' –

+1

爲了覆蓋第一次插入,您可以使用「從測試中選擇NVL(max(seq_fld),0)」 –

1

你可以把本次的最大值在一個變量與@var_name = SELECT MAX(column_name) FROM TABLE

,那麼你可以使用ROW_NUMBER() OVER (ORDER BY column_name)[email protected]_name

+0

你想說我在我的文章中編輯過什麼 –

相關問題