这应该(希望)是一个快速的,不幸的是我今天有点慢,需要你的帮助。
我基本上写了一个带有以下结构的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的基础上实现它。
我希望有人有解决方案,我今天不知所措,无法真正看到它。提前谢谢!
答案 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]