【问题标题】:Oracle: insert without columns specificationOracle:插入没有列规范
【发布时间】:2024-01-22 23:37:01
【问题描述】:

我有一个带有序列和触发器的 oracle 表来自动增加列。 现在我想做一个插入。通常我应该写:

INSERT INTO table (column1, column2,...) VALUES (value1, value2)

但我只想插入一条没有默认值的记录。如何在 Oracle 中做到这一点?

`Mysql`: INSERT INTO table () VALUES ()

`Mssql`: INSERT INTO table default VALUES 

`Oracle:` INSERT INTO table (column1, column2,...) VALUES (default, default,...)

这是唯一的方法吗?我必须列出所有列?

【问题讨论】:

    标签: oracle triggers insert sequence auto-increment


    【解决方案1】:
    INSERT INTO table (column1) VALUES (default);
    

    其余的将默认!

    【讨论】:

      【解决方案2】:

      在 Oracle 中,您不必指定列,但不这样做会使您在表定义更改时引入错误。

      你可以插入:

      INSERT INTO t VALUES (value1, value2, value3);

      假设表 t 有三列

      插入要好得多且可支持:

      INSERT INTO t (column1, column2, column3) VALUES (value1, value2, value3);

      当您介绍从 PL/SQL 到 SQL 的上下文切换,然后再次回到 PL/SQL 时,我不会使用 PL/SQL(如果您能提供帮助的话)。

      【讨论】:

        【解决方案3】:

        我在第一次阅读时错过了这部分:

        我有一个带有序列和自动增量触发器的 oracle 表 一列。

        所以我假设在 PK 列上使用该序列填充,而其他列都有默认值。鉴于此,我会这样做:

        INSERT INTO table (pk_column) VALUES (NULL);
        

        触发器将覆盖 NULL 值(如果由于某种原因没有覆盖,插入将失败);其他列将使用默认值填充。

        【讨论】:

        • 您可以在 pk 中添加 default null,然后插入将是 insert into table (pk_column) values (default)
        【解决方案4】:

        这是唯一的方法吗?我必须列出所有列?

        是的。最好始终在 INSERT 语句中指定要为其提供值的所有列。

        【讨论】:

        • 不,您没有列出所有列。
        【解决方案5】:

        只有一种情况,您不需要在 Oracle 中指定 COLUMNS,也就是当您插入的行具有为所有列指定的值并且其顺序也与桌子。在所有其他情况下,需要指定列列表。

        例子:

        create table tt (id number, name varchar2(30));
        insert into tt values (1,'AC');
        insert into tt values ('2',1);
        

        特别注意第二个插入语句 -> 第一个参数“2”作为字符串提供,期望是 ID 列中的数字。这里进行必要的转换并在 ID 列中插入 2。但用户可能想在 NAME 列中插入“2”,并将 1 作为 ID。通过指定列列表 Oracles 可以帮助我们避免此类错误。

        现在很少有任何情况下您不需要指定列列表,因为几乎所有创建的表都具有自动递增的唯一 ID 列,该列通过触发器自动填充或因为 IDENTITY columns并且您仅提供其余列的值,这意味着必须提供这些列列表,否则将导致错误。

        如果此唯一 ID 是由应用程序生成并插入的,例如通过随机数生成或 Hibernate 在 java 应用程序中生成的,则可能会避免插入所有列。

        【讨论】: