выбрать максимальное значение столбца в таблице без строк - PullRequest
4 голосов
/ 04 февраля 2011

Я использую базу данных Oracle

При вставке строки в таблицу мне нужно найти максимальное значение столбца, увеличить его на 1 и использовать это значение в строке, которую я вставляю.

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

Это прекрасно работает, если их хотя бы одна запись в таблице. Но возвращает ноль, если их нет в таблице.

Как я могу получить значение по умолчанию 1, когда их нет в таблице.

Ответы [ 6 ]

12 голосов
/ 04 февраля 2011
SELECT COALESCE(MAX(ROUTE_ID),0) ...
11 голосов
/ 04 февраля 2011

Это не безопасный способ создания поля автоинкремента. Вы можете использовать последовательность Oracle для достижения этой цели.

Что касается нулевого значения, вы можете использовать NVL, чтобы задать значение по умолчанию (скажем, 0) в случае, если функция возвращает нулевое значение.

2 голосов
/ 04 февраля 2011

Использование:

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;
2 голосов
/ 04 февраля 2011

Использовать последовательность для идентификатора. Вам нужно создать последовательность. Смотрите ниже ссылку

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

1 голос
/ 04 февраля 2011

Установить значение по умолчанию для NULL

SELECT NVL(MAX(ROUTE_ID),0)

, хотя использование последовательности может быть проще, если вы не обращаете внимания на нечетные пропуски в идентификаторах маршрутов

0 голосов
/ 07 февраля 2011

Если вы обеспокоены наличием пробелов в идентификаторах маршрутов, создайте последовательность с помощью предложения NOCACHE:

CREATE SEQUENCE dts_route_seq NOCACHE;

Обратите внимание, что производительность снижается, поскольку Oracle теперь приходится «фиксировать» каждый разВы увеличиваете последовательность.

...