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