将自动生成的密钥添加到Oracle中的现有PK

时间:2016-04-13 16:19:50

标签: sql oracle plsql oracle12c

我将基于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>

感谢。

1 个答案:

答案 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或更低,您必须创建一个触发器