我将基于SQL Server的应用程序移植到Oracle。我们的Oracle DBA给了我一个架构,该架构应该与原始的SQL Server架构相同(并从中生成),但缺少自动生成的密钥。我试图将这些表格PK从正常的INT改为递增。我正在使用Oracle SQL Developer 4.0.3和Oracle 12c。
我收到的错误是ORA-01442: column to be modified to NOT NULL is already NOT NULL
我在编辑完表格后选择了该列,并将其标识下拉列表设置为“生成身份”。我不确定为什么SQl Developer在它已经是PK的时候试图让它不为空。
我的问题是:这是设置生成密钥的正确方法吗?我怎么能绕过这个?如果我改变所有必需的列,DBA是否可以使用模式重新生成他用于创建它的任何过程,以允许正确生成的密钥,是否有更好的解决方案来创建一个好的模式以继续?< / p>
感谢。
答案 0 :(得分:3)
如果列已被定义为NOT NULL,则无需将其重新定义为NOT NULL。因此,您会收到错误ora-01442。
在插入行之前,获取序列值(如SQL Server中的标识)的最佳方法是使用默认序列定义列:
CREATE SEQUENCE SEQ_NAME
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
ALTER TABLE table_name MODIFY column_name INT DEFAULT SEQ_NAME.NEXTVAL;
PD:此DEFAULT适用于12 c。要达到11g或更低,您必须创建一个触发器