Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将自动生成的密钥添加到Oracle中的现有PK_Sql_Oracle_Plsql_Oracle12c - Fatal编程技术网

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

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”后得到了这个结果。我

我正在将一个基于SQL Server的应用程序移植到Oracle。我们的Oracle DBA给了我一个模式,该模式本应与原始SQL Server模式(并从中生成)相同,但自动生成的密钥丢失了。我正在尝试将这些表PK从普通INT改为递增。我正在使用Oracle SQL Developer 4.0.3和Oracle 12c来实现这一点

我收到的错误是
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或更小,必须创建触发器