2015-07-16 2 views
1

Это должно (надеюсь) быть быстрым, к сожалению, сегодня я немного неспокойно и нуждаюсь в вашей помощи.Увеличение значения в mutliple строке Инструкция INSERT

Я в основном написал заявление INSERT со следующей структурой, чтобы вставить несколько строк с помощью одного оператора:

INSERT INTO TABLE_TO_INSERT_INTO 
SELECT 
    -- ..., 
    -- ..., 
    -- ..., 
    (SELECT MAX(ID)+1 FROM SOME_TABLE) As ID, 
    -- ..., 
    -- ..., 
FROM 
    (
     -- Subqueries and Joins here 
     -- ... 
    ) ; 

Как правило, это работает прекрасно, но для одной части: идентификатор.

Он должен быть уникальным (ограничение этого обязательно), но с текущим способом выбора идентификатора, который не имеет места, поскольку он использует выбранное значение для всех строк, вставленных с помощью вышеуказанного утверждения ,

Есть ли способ принудительного повторного использования части (SELECT MAX(ID)+1 FROM SOME_TABLE) As ID после каждой вставленной строки?

Я действительно не хочу использовать триггер, но вместо этого реализую его на основе чистого SQL.

Я надеюсь, что у кого-то есть решение, я сегодня в недоумении и не могу его увидеть. Заранее спасибо!

+2

Try использовать последовательность выбора ...., seq_name.nextval, .... . –

+0

Также см. [Этот вопрос] (http://stackoverflow.com/q/17210835/266304) для некоторых проблем с использованием 'max (id) + 1' в целом. –

ответ

2

Как вы используете Oracle, то я хотел бы предложить вам использовать SEQUENCE

CREATE SEQUENCE customers_seq 
START WITH  1000 
INCREMENT BY 1 
NOCACHE 
NOCYCLE; 

В запросе

SELECT customers_seq.nextval from yourTable; 

Вышеупомянутые гарантии запроса возвращать уникальное значение после каждого исполнения.

+0

Вот что я искал, спасибо! – daZza

+0

Если это помогло. Тогда не стесняйтесь принять ответ. :) – Ravi

+0

Будет делать 4 минуты ;-) – daZza

-2

В SQL 2012 вы можете использовать последовательность и использовать ее при вставке данных.

Вы можете обратиться следующее: [https://msdn.microsoft.com/en-us/library/ff878091.aspx][1]

+0

Это не совсем полезно для вопроса, помеченного как Oracle. –

0

Если не вы вставляете в SOME_TABLE (которые вы не), (SELECT MAX (ID) +1 FROM SOME_TABLE) Как ID всегда будет возвращать то же значение, потому что MAX (ID) не зависит от дополнительных строк в TABLE_TO_INSERT_INTO.

Вы могли бы теоретически использовать какое-то смещение числа строк плюс значение MAX (ID), но я бы настоятельно советовал ему. Вам было бы лучше использовать поле, которое имеет рассчитанное значение семян и приращений в соответствии с наилучшей практикой, так как это будет хорошо работать с распределенными транзакциями.

0

вы могли бы использовать ROWNUM, но будьте осторожны при сортировке, то вам нужен дополнительный подзапрос вокруг оригинального SELECT

(SELECT MAX(ID)+ROWNUM FROM SOME_TABLE) As ID, 
Смежные вопросы