【问题标题】:Oracle not auto-generating primary key on insertOracle 在插入时不会自动生成主键
【发布时间】:2019-07-23 15:02:08
【问题描述】:

这里是 Oracle 的新手。我有一个使用以下 SQL 创建的表:

create table Widgets (
    id              integer constraint pkWidgets primary key using index,
    ruleId          integer not null,
    customerId      integer constraint fkWidgets_Customers references Customers
);

我现在正尝试在此表中插入一条记录:

INSERT INTO Widgets (
  ruleId,
  customerId
) VALUES (
  88471239,
  null
);

并得到以下错误:

INSERT INTO Widgets not successful
An error occurred when executing the SQL command:
INSERT INTO Widgets (
  ruleId,
  customerId...

ORA-01400: cannot insert NULL into ("MYSCHEMA"."WIDGETS"."ID") [SQL State=23000, DB Errorcode=1400]
1 statement failed.

Execution time: 0.13s

这是怎么回事? Oracle 不应该自动生成我的主键(id 字段)值吗?如果没有,我怎么知道(确切的 SQL)需要为这个值插入什么?

【问题讨论】:

  • 看来你还需要插入 id 值。

标签: sql oracle primary-key


【解决方案1】:

我可以使用 ids.nextval 并且我的插入效果很好:

INSERT INTO Widgets (
  id,
  ruleId,
  customerId
) VALUES (
  ids.nextval,
  88471239,
  null
);

【讨论】:

    【解决方案2】:

    仅仅将某些东西声明为主键不会导致生成值。在 Oracle 12C 中,您可以使用:

    id  integer generated always as identity primary key
    

    在早期版本中,您可以使用触发器来执行此操作。

    【讨论】:

    • 感谢@Gordon Linoff (+1),但我无法更改表格的创建方式。听起来我需要在插入时提供自己的 ID?
    • @hotmeatballsoup 。 . .是的,通常会为此使用序列。可以加个触发器吗?还是换桌子?
    • 谢谢@Gordon,有人告诉我我可以使用ids.nextval 作为解决方案,它可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多