2011-02-04 47 views
3

我使用Oracle數據庫選擇在表中的列的最大值沒有行

雖然在表中插入一行,我需要找到一個列的最大值和遞增1它,並使用該我插入的行的值。

INSERT INTO dts_route 
    (ROUTE_ID, ROUTE_UID, ROUTE_FOLDER) 
VALUES (
         (SELECT MAX(ROUTE_ID) + 1 FROM route) , 
         ROUTE_UID, 
         ROUTE_FOLDER) 

這工作正常,如果他們至少有一個表中的條目。 但是當它們在表中沒有條目時返回null。

當他們在表中沒有條目時,我如何獲得默認值1。

回答

10
SELECT COALESCE(MAX(ROUTE_ID),0) ... 
+9

@changed必須警告您使用此方法可能會在具有併發性的系統中獲取重複值。風險與併發事務的數量成正比。我警告你,因爲它看起來就是你想要避免的。 – jachguate 2011-02-04 18:10:09

1

設置爲NULL默認

SELECT NVL(MAX(ROUTE_ID),0) 

但如果你不介意在你的路徑ID

11

奇差距這是不是一種安全的方式使用順序可能是更容易創建一個自動增量字段。您可以使用Oracle序列來實現此目標。

至於null,你可以使用NVL給出一個默認值(比如0),以防函數返回null。

+7

+1,我希望我可以多次投票。 MAX(key)+ 1是一個錯誤的低效解決方案。 – 2011-02-04 17:28:51

2

用途:

INSERT INTO dts_route 
    (ROUTE_ID) 
SELECT COALESCE(MAX(r.route_id), 0) +1 
    FROM ROUTE r 

...但你真的應該使用sequence用連續的數字值來填充值:

CREATE SEQUENCE dts_route_seq; 

。 ..

INSERT INTO dts_route 
    (ROUTE_ID) 
SELECT dts_route_seq.NEXTVAL 
    FROM DUAL; 
+0

如果絕對需要增加1,請確保對序列使用NOCACHE,否則您可能會看到數字跳過緩存數量的因素(超時緩存問題)。 – tbone 2011-02-07 16:12:22

0

如果你關心你的路徑ID有是空白,然後創建一個與NOCACHE子句的順序:

CREATE SEQUENCE dts_route_seq NOCACHE; 

注意,是有性能損失,因爲甲骨文現在已經「落實」每次遞增時間序列。

相關問題