SQL 错误:ORA-02000:创建基于标识列的表时缺少 ALWAYS 关键字

新手上路,请多包涵

我尝试在表上创建一个自动递增的列,正如我在这篇 文章 中看到的那样,有两种方法,第二种使用 Identity 列的实现是一种更优雅的解决方案,但是当我尝试实现它时,出现以下错误:

     Error at Command Line : 3 Column : 31
    Error report -
    SQL Error: ORA-02000: missing ALWAYS keyword
    02000. 00000 -  "missing %s keyword"

实表脚本实现:

 CREATE TABLE "PLATFORM"."AUTH_PERMISSION"
(
    ID NUMBER(19,0) GENERATED BY DEFAULT ON NULL AS IDENTITY,
    -- ID NUMBER(19,0) PRIMARY KEY NOT NULL,
    NAME VARCHAR2(50) UNIQUE NOT NULL,
    ACTION_ID NUMBER(19,0) NOT NULL,
    RESOURCE_ID NUMBER(19,0) NOT NULL,
    ENVIRONMENT_ID NUMBER(19,0) NOT NULL,
    CONSTRAINT "ACTION_ID" FOREIGN KEY ("ACTION_ID")
      REFERENCES "AUTH_ACTION" ("ID") ENABLE,
    CONSTRAINT "ENVIRONMENT_ID" FOREIGN KEY ("ENVIRONMENT_ID")
      REFERENCES "AUTH_ENVIRONMENT" ("ID") ENABLE,
    CONSTRAINT "RESOURCE_ID" FOREIGN KEY ("RESOURCE_ID")
      REFERENCES "AUTH_RESOURCE" ("ID") ENABLE,
    UNIQUE (ACTION_ID, ENVIRONMENT_ID, RESOURCE_ID)
);

可以看出,我尝试自增的列是表的主键。

是我从哪里得到解决方案的参考。

问题是我使用了旧版本的 Oracle,11g。

原文由 aurelius 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

也许您尝试连接的 Oracle 数据库 (服务器)12c ,但是您使用的客户端 (安装在本地) 不支持该功能。请检查您的 Oracle 客户端版本,可能是 11g 或更低 版本不支持。您需要下载更高版本的客户端。

在版本 12.1.0.1 上完美运行。

 SQL> select banner from v$version where rownum = 1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production

SQL> CREATE TABLE AUTH_PERMISSION
  2  (
  3      ID NUMBER(19,0) GENERATED BY DEFAULT ON NULL AS IDENTITY,
  4      -- ID NUMBER(19,0) PRIMARY KEY NOT NULL,
  5      NAME VARCHAR2(50) UNIQUE NOT NULL,
  6      ACTION_ID NUMBER(19,0) NOT NULL,
  7      RESOURCE_ID NUMBER(19,0) NOT NULL,
  8      ENVIRONMENT_ID NUMBER(19,0) NOT NULL
  9  );

Table created.

原文由 Lalit Kumar B 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您遇到此问题,并且无法将数据库/客户端从 11 更新到 12,那么这里是解决方法。

  1. 将以下代码行添加到您的 Dbcontext Class`
 optionsBuilder.UseOracle(configuration.GetConnectionString("DefaultConnection"), b =>
            b.UseOracleSQLCompatibility("11"));

说明: Oracle 11g 不支持 IDENTITY 命令。必须使用触发器和序列生成 PK。当您将 UseOracleSQLCompatibility(“11”) 添加到 DbContext 时,EF 将生成与 oracle 11g 兼容的迁移脚本。在这种情况下,将生成一个序列表以供 PKS 使用。

  1. 您可能遇到的另一个问题是: ORA-00972: identifier is too long

如果你遇到这个错误,这意味着 oracle 数据库版本低于 12 只支持最大长度为 30 的标识符。

解决方案:

  1. 对于 3.1 以下的 Dotnet Core,请使用将其添加到您的 DBContext 类

modelBuilder.Model.Relational().MaxIdentifierLength = 30;

  1. 对于上面的 Dotnet Core 3.1,请改用它。

modelBuilder.Model.SetMaxIdentifierLength(30);

原文由 caged_raven_wings 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题