Sql 将自动生成的密钥添加到Oracle中的现有PK
我正在将一个基于SQL Server的应用程序移植到Oracle。我们的Oracle DBA给了我一个模式,该模式本应与原始SQL Server模式(并从中生成)相同,但自动生成的密钥丢失了。我正在尝试将这些表PK从普通INT改为递增。我正在使用Oracle SQL Developer 4.0.3和Oracle 12c来实现这一点 我收到的错误是Sql 将自动生成的密钥添加到Oracle中的现有PK,sql,oracle,plsql,oracle12c,Sql,Oracle,Plsql,Oracle12c,我正在将一个基于SQL Server的应用程序移植到Oracle。我们的Oracle DBA给了我一个模式,该模式本应与原始SQL Server模式(并从中生成)相同,但自动生成的密钥丢失了。我正在尝试将这些表PK从普通INT改为递增。我正在使用Oracle SQL Developer 4.0.3和Oracle 12c来实现这一点 我收到的错误是ORA-01442:要修改为非空的列已经不是空的 我在编辑表、选择列并将其标识下拉列表设置为“GenerateasIdentity”后得到了这个结果。我
ORA-01442:要修改为非空的列已经不是空的
我在编辑表、选择列并将其标识下拉列表设置为“GenerateasIdentity”后得到了这个结果。我不知道为什么SQLDeveloper试图在它已经是PK时使它不为null
我的问题是:这是设置生成密钥的正确方法吗?我怎样才能避开这件事?如果我修改了所有必需的列,DBA是否可以使用模式重新生成他在创建它时首先使用的任何过程,以允许正确生成键?是否有更好的解决方案来创建好的模式
谢谢。如果该列已定义为NOT NULL,则无需将其重新定义为NOT NULL。因此您得到错误ora-01442 获取序列值(如SQL Server中的identity)的最佳方法是在插入行之前使用默认序列定义列:
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:此默认值适用于12 c。对于11g或更小,必须创建一个触发器如果列已定义为NOT NULL,则无需将其重新定义为NOT NULL。因此您得到错误ora-01442 获取序列值(如SQL Server中的identity)的最佳方法是在插入行之前使用默认序列定义列:
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:此默认值适用于12 c。对于11g或更小,必须创建触发器