【问题标题】:How to use default primary key as a sequence value when creating table for oracle database columns为oracle数据库列创建表时如何使用默认主键作为序列值
【发布时间】: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/…
  • 谢谢。这很有帮助。

标签: database plsql primary-key default


【解决方案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 列的总大小不会影响您的性能/大小要求,我说是因为您提到了一些性能问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2021-06-04
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多