为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 不能用于表的默认值,这是通过Trigger
和Sequence
当您想要任何人都可以轻松阅读/记住/理解的序列号时实现的。但是如果你不想通过这种方式管理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数据库列创建表时如何使用默认主键作为序列值的主要内容,如果未能解决你的问题,请参考以下文章