日期:2014-05-17  浏览次数:21009 次

oracle数据库的主键递增问题,插入数据问题
刚用oracle数据库,我现在想向oracle数据库中插入数据,USER表字段如:U_ID、U_Name,U_ID是主键(我不知道是否设置了自动递增的功能),之前sql server中插入数据的时候U_ID是不用写的,现在我在oracle中不写就会报错提示U_ID不能为空,数据库不是我建立的,之前如何插入数据我也不太清楚。

网上说这样写:

create sequence table_id start with 1 increment by 1; 
Insert into TRAIN.USER(U_ID, U_Name)Values(table_id.nextval, ‘张三’);


我这样写之后提示:
[SQL] create sequence table_id start with 1 increment by 1
[Err] ORA-00955: name is already used by an existing object

我的猜测是:是不是之前建立表的时候就已经为这个表建立了这个递增变量,我要插入数据的时候不需要写create sequence table_id start with 1 increment by 1;  直接用这个递增变量.nextval就可以了。
不知道猜测是否正确?如果正确我用什么语句可以获得这个变量的名称呢?

请大家指点一下。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

通过user_tab_cols,查看该表对应字段上是否存在默认值。。如果没有默认值就很麻烦了。。
建议还是别递增了,以后的主键都取sys_guid()吧。。


不好意思,我不知道如何:通过user_tab_cols,查看该表对应字段上是否存在默认值。 能否在说清楚一些呢。
我现在可以打开表的设计视图,下图EFID:

应该没有默认值,那么你所说的从sqlserver导入oralce时候不用,我不太明白你是通过什么方式导入的。是通过程序自己写的还是其他的工具。
另外建议你查看一下表中字段到底是什么样的,是什么样的一个递增主键。



我现在就是直接用Navicat for Oracle软件连接到的Oracle数据库上,然后执行Sql语句:
[/
Insert into TRAIN.ELECTRONFEE
(
EFID, YEAR, FEE, DEPTID, USERID, TYPE
)
Values
(
147929, 2014, 50 , 101 ,  178907 , 2
)
code]
我就是想知道EFID能不能自动来递增,不然就要去获得到最大的EFID值,然后在这个值上面+1,不然就会导致EFID值重复而报错,因为EFID是主键不能重复。

可以,创建一个序列,初始化值为目前id的最大值。
因为oracle不可以直接使用序列的值作为默认值。。所以需要创建触发器来在实现自增。需要的话我可以帮你写。
建议还是在程序中,
[code=sql]Insert into TRAIN.ELECTRONFEE
(
EFID, YEAR, FEE, DEPTID, USERID, TYPE
)
Values
(
序列.nextval, 2014, 50 , 101 ,  178907 , 2
)


多谢,如果我创建一个序列会不会影响之前的程序呢?因为这数据库不是我自己连接,其他人也会往这个数据库中插入数据,我怕我创建完序列之后会影响其他人往里插入数据。


如果是这样的话,我建议你还是不要用序列了。。直接使用oracle自带的sys_guid()吧。
能保证唯一性。。否则万一别人有自己的序列,别的程序就会报错了。。
------解决方案--------------------
oracle中没有自增字段,都是用sequence代替的。
主键不能重复,其他人要插入数据应该也是用sequence的,建议和别人统一一下,全用一个sequence。