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

发布于 2024-10-16 05:02:01 字数 382 浏览 0 评论 0原文

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

I am using oracle database

While inserting a row in a table, i need to find the max value of a column and increment it by 1, and use that value in row i am inserting.

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

This works fine if their is at least one entry in table.
But returns null when their are no entries in table.

How can i get default value of 1 when their are no entries in table.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

醉酒的小男人 2024-10-23 05:02:01
SELECT COALESCE(MAX(ROUTE_ID),0) ...
SELECT COALESCE(MAX(ROUTE_ID),0) ...
傲鸠 2024-10-23 05:02:01

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

至于 null,您可以使用 NVL 给出默认值(例如 0),以防函数返回 null。

This is not a safe way of creating an auto-increment field. You can use an Oracle sequence to achieve this goal.

As for the null, you can use NVL to give a default value (say, 0) in case the function returns null.

森林迷了鹿 2024-10-23 05:02:01

使用 ID 序列。您需要创建序列。请参阅下面的链接

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

Use sequence for the ID. You need to create sequence. See below link

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

余罪 2024-10-23 05:02:01

使用:

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;

Use:

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

...but you really should be using a sequence to populate the value with a sequential numeric value:

CREATE SEQUENCE dts_route_seq;

...

INSERT INTO dts_route 
   (ROUTE_ID)
SELECT dts_route_seq.NEXTVAL
  FROM DUAL;
双手揣兜 2024-10-23 05:02:01

设置默认值为 NULL,

SELECT NVL(MAX(ROUTE_ID),0)

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

Set a default for NULL

SELECT NVL(MAX(ROUTE_ID),0)

though using a sequence might be easier if you don't mind the odd gaps in your route ids

夜司空 2024-10-23 05:02:01

当 null 时选择 0,那么它将是 0+1,与 null+1 相比,这是一个正确的数字

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

select 0 when null, then it will be 0+1 which is a correct number compared to null+1

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

○愚か者の日 2024-10-23 05:02:01

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

CREATE SEQUENCE dts_route_seq NOCACHE;

请注意,这会影响性能,因为 Oracle 现在必须在每次增加序列时“提交”。

If you are concerned about there being gaps in your route ids then create the sequence with the NOCACHE clause:

CREATE SEQUENCE dts_route_seq NOCACHE;

Note that there is a performance hit because Oracle now has to "commit" each time you increment the sequence.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文