Oracle 12引入了很好的功能(应该很久以前就已经存在了!) - 标识列 . 所以这是一个脚本:
CREATE TABLE test (
a INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
b VARCHAR2(10)
);
-- Ok
INSERT INTO test (b) VALUES ('x');
-- Ok
INSERT INTO test (b)
SELECT 'y' FROM dual;
-- Fails
INSERT INTO test (b)
SELECT 'z' FROM dual UNION ALL SELECT 'zz' FROM DUAL;
前两个插入运行没有问题,提供'a'的值为1和2.但是第三个插入失败了 ORA-01400: cannot insert NULL into ("DEV"."TEST"."A")
. 为什么会这样?一个bug?关于identity column restrictions的文档部分中没有提到这样的内容 . 或者我只是做错了什么?
1 回答
我相信以下查询有效,我还没有测试过!
不确定,如果它对你有所帮助 .
对于
GENERATED ALWAYS AS IDENTITY
Oracle仅在内部使用序列 . 一般序列的选项也适用于此 .NEXTVAL用于获取下一个可用序列,显然它是一个伪列 .
以下是Oracle
您不能在以下构造中使用
CURRVAL
和NEXTVAL
:DELETE
,SELECT
或UPDATE
语句中的子查询查看视图或物化视图
带有DISTINCT运算符的SELECT语句
带有GROUP BY子句或ORDER BY子句的SELECT语句
与另一个
SELECT
语句与UNION,INTERSECT
或MINUS
set运算符组合的SELECT
语句SELECT语句的WHERE子句
CREATE TABLE或ALTER TABLE语句中列的DEFAULT值
CHECK约束的条件
上面的
subquery
和SET
操作规则应该回答您的问题 .并且由于NULL的原因,当
pseudocolumn
(例如NEXTVAL)与SET操作或上面提到的任何其他规则一起使用时,输出为NULL,因为Oracle无法通过组合多个选择来提取它们 .让我们看看下面的查询,
结果是