为oracle数据库列创建表时如何使用默认主键作为序列值

Posted

技术标签:

【中文标题】为oracle数据库列创建表时如何使用默认主键作为序列值【英文标题】:How to use default primary key as a sequence value when creating table for oracle database columns 【发布时间】:2014-01-22 12:21:38 【问题描述】:

我们有一个工具,这个工具创建了一些插入脚本来在我们的 plsql 表中添加行。 这个脚本是不可修改的,我们看不到这个脚本。所以,

当数据行到来时(带有我们不知道结构的插入脚本),我们应该给出一个主键。我们可以使用触发器,但出于性能原因我们不想这样做。

下面的代码不起作用。

CREATE TABLE qname
  (
    qname_id integer NOT NULL default qname_id_seq.nextval PRIMARY KEY,
   );

有什么想法吗? 谢谢..

【问题讨论】:

“我们可以使用触发器,但出于性能原因我们不想这样做” - 您是否实际测量过性能影响? 我们当然应该考虑性能。该表将占用大量行并为所有这些行操作触发器。这很贵 Oracle 12 提供了一个使用身份列执行此操作的新选项:oracle-base.com/articles/12c/… 谢谢。这很有帮助。 【参考方案1】:

.nextval 不能用于表的默认值,这是通过TriggerSequence 当您想要任何人都可以轻松阅读/记住/理解的序列号时实现的。但是如果你不想通过这种方式管理ID Column(如qname_id),并且该列的值不是很大,你可以在创建表时使用SYS_GUID()来获得这样的Auto Increment。

CREATE TABLE qname 
(qname_id RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
name VARCHAR2(30));

(或通过修改列)

现在您的qname_id 列将接受“全局唯一标识符值”。 您可以通过忽略这样的 emp_id 列在表中插入值。

INSERT INTO qname (name) VALUES ('name value');

因此,它将向您的 qname_id 列插入唯一值。

【讨论】:

非常感谢,我们需要这样的解决方案。 总是欢迎,但请确保此 qname_id 列的总大小不会影响您的性能/大小要求,我说是因为您提到了一些性能问题。

以上是关于为oracle数据库列创建表时如何使用默认主键作为序列值的主要内容,如果未能解决你的问题,请参考以下文章

oracle一个表中没有主键怎么设置主键

sql server建表时怎么设置ID字段自增

sql server建表时怎么设置ID字段自增

Oracle实现主键字段自增

在sql创建数据库表时,如何为字段设一个默认值

oracle在建表时如何指定主键的索引名和主键的表空间