增加多行INSERT语句中的值

时间:2015-07-16 09:34:30

标签: sql database oracle

这应该(希望)是一个快速的,不幸的是我今天有点慢,需要你的帮助。

我基本上写了一个带有以下结构的INSERT语句,以便用一个语句插入多行:

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

这通常完全正常,但对于一部分:ID。

它必须是唯一的(约束确保这一点),但是使用当前选择不是这种情况的ID的方式,因为它使用通过上述语句插入的所有行的选定值。

在每行插入后,有没有办法强制重新评估(SELECT MAX(ID)+1 FROM SOME_TABLE) As ID部分?

我真的不想使用触发器,而是在纯SQL的基础上实现它。

我希望有人有解决方案,我今天不知所措,无法真正看到它。提前谢谢!

4 个答案:

答案 0 :(得分:2)

当您使用Oracle时,我建议您使用SEQUENCE

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

在您的查询中

SELECT customers_seq.nextval from yourTable;

上述查询保证在每次执行后返回唯一值。

答案 1 :(得分:0)

除非您要插入SOME_TABLE(您不是),否则(SELECT MAX(ID)+1 FROM SOME_TABLE)由于ID(ID)总是返回相同的值,因为MAX(ID)不受TABLE_TO_INSERT_INTO中其他行的影响

理论上你可以使用某种行数偏移加上你的MAX(ID)值,但我强烈建议不要这样做。根据最佳实践,您最好使用具有种子和增量计算值的字段,因为这将适用于分布式事务。

答案 2 :(得分:0)

您可以使用ROWNUM,但在排序时要小心,那么您需要在原始SELECT周围添加额外的子查询

(SELECT MAX(ID)+ROWNUM FROM SOME_TABLE) As ID,

答案 3 :(得分:-2)

在SQL 2012中,您可以使用序列并在插入数据时使用序列。

您可以参考以下内容: [https://msdn.microsoft.com/en-us/library/ff878091.aspx][1]