选择表中没有行的列的最大值

时间:2011-02-04 17:20:18

标签: sql oracle insert oracle10g

我正在使用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。

7 个答案:

答案 0 :(得分:12)

SELECT COALESCE(MAX(ROUTE_ID),0) ...

答案 1 :(得分:11)

这不是创建自动增量字段的安全方法。您可以使用Oracle序列来实现此目标。

对于null,如果函数返回null,可以使用NVL给出默认值(比如0)。

答案 2 :(得分:2)

使用序列作为ID。你需要创建序列。见以下链接

http://www.basis.com/onlinedocs/documentation/b3odbc/sql_sequences.htm

答案 3 :(得分: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;

答案 4 :(得分:1)

设置NULL的默认值

SELECT NVL(MAX(ROUTE_ID),0)

如果您不介意路线ID中的奇怪间隙,则使用序列可能会更容易

答案 5 :(得分:0)

如果您担心路由ID中存在间隙,请使用NOCACHE子句创建序列:

CREATE SEQUENCE dts_route_seq NOCACHE;

请注意,由于Oracle每次递增序列时都必须“提交”,因此性能会受到影响。

答案 6 :(得分:0)

null 时选择 0,则为 0+1,与 null+1 相比,这是一个正确的数字

SELECT isnull(MAX(ROUTE_ID),0) + 1 FROM route