【问题标题】:Alter table after keyword in OracleOracle中关键字后更改表
【发布时间】:2023-03-30 00:35:01
【问题描述】:
ALTER TABLE testTable ADD column1 NUMBER(1) DEFAULT 0 NOT NULL AFTER column2;

为什么我也不能在 Oracle 中使用 mySql 语法?上面的命令在 MySql 中有效。你能给我一个有效的等价物吗?


Error report:
SQL Error: ORA-01735: invalid ALTER TABLE option
01735. 00000 -  "invalid ALTER TABLE option"

请问有没有办法在我提供的Oracle命令中使用after子句?

【问题讨论】:

  • 您是在询问正确的语法还是询问原因?
  • “为什么我不能在 Oracle 中也使用 mySql 语法?”。据我所知。 MySQL 有一些非常特殊的 SQL 语法,它们与其他语法不同。几乎所有数据库供应商的语法都接近 SQL 标准,但没有实现 SQL 标准。它们几乎都不同。
  • @cctan:我添加了编辑 2 作为对您问题的回应
  • @Floradu88 已经 +1 以获得好的答案
  • 它在 MySql 中有效,在 Oracle 或 SqlServer 中无效;但是,很想拥有这个功能

标签: oracle oracle11g ddl alter-table


【解决方案1】:

因为 SQL 是一种关系代数。它一点也不关心列在表中的“位置”,只关心它们是否存在。

要让它在 Oracle 中工作,只需去掉 after 子句。 alter table 的 Oracle 文档是 here,但归结为:

alter table testTable
    add ( column1 number(1) default 0 not null )

alter table 命令有没有after 子句。

【讨论】:

  • 我希望能够使用该子句,而无需重新创建表
  • @Floradu88,那么您需要与 Oracle 而不是我们交谈。我和拉里不是很亲近:-)
  • @Floradu88:不,不是没有重新创建表格。
  • @Floradu88,您不会丢失数据,您可以创建一个新表,将旧数据传输到其中(例如,请参阅 Ilion 的答案)。您可能希望在停机期间执行此操作,但这是可行的。
  • 您还可以使用 DBMS_REDEFINITION 包对列进行重新排序,而无需离线。
【解决方案2】:

试试这个:

ALTER TABLE testTable ADD column1 NUMBER(1) DEFAULT 0 NOT NULL

【讨论】:

    【解决方案3】:

    Oracle 不支持在表中间添加列,只添加到表尾。您的数据库设计和应用程序功能不应依赖于数据库架构中列的顺序。毕竟,您总是可以在您的选择语句中指定一个顺序。

    但是,如果由于某种原因您必须在表格中间添加一个新列,则可以解决此问题。

    CREATE TABLE tab1New AS SELECT 0 AS col1, col1 AS col2 FROM tab1;
    DROP TABLE tab1 PURGE;
    RENAME tan1New to tab1;
    

    SELECT 0 AS col1 是您的新列,然后您根据需要从原始表中指定其他列。按您想要的顺序将SELECT 0 AS col1 放在适当的位置。

    之后,您可能希望在列上运行 alter table 语句,以确保它是您想要的数据类型。

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2022-12-10
      • 2018-02-24
      • 1970-01-01
      • 2012-11-24
      • 2013-09-16
      相关资源
      最近更新 更多