[英]select max value of a column in table with no rows
我正在使用 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。
SELECT COALESCE(MAX(ROUTE_ID),0) ...
这不是创建自动增量字段的安全方法。 您可以使用 Oracle 序列来实现此目标。
至于 null,您可以使用NVL
给出默认值(例如 0),以防函数返回 null。
使用序列作为 ID。 您需要创建序列。 见下面的链接
http://www.basis.com/onlinedocs/documentation/b3odbc/sql_sequences.htm
采用:
INSERT INTO dts_route
(ROUTE_ID)
SELECT COALESCE(MAX(r.route_id), 0) +1
FROM ROUTE r
...但你真的应该使用一个序列来用一个连续的数值填充值:
CREATE SEQUENCE dts_route_seq;
...
INSERT INTO dts_route
(ROUTE_ID)
SELECT dts_route_seq.NEXTVAL
FROM DUAL;
为 NULL 设置默认值
SELECT NVL(MAX(ROUTE_ID),0)
尽管如果您不介意路线 ID 中的奇怪间隙,使用序列可能会更容易
当 null 时选择 0,那么它将是 0+1,与 null+1 相比,这是一个正确的数字
SELECT isnull(MAX(ROUTE_ID),0) + 1 FROM route
如果您担心路由 ID 中存在间隙,请使用 NOCACHE 子句创建序列:
CREATE SEQUENCE dts_route_seq NOCACHE;
请注意,这会影响性能,因为 Oracle 现在必须在每次递增序列时“提交”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.