【问题标题】:Inserting an empty row插入一个空行
【发布时间】:2013-08-19 22:44:13
【问题描述】:

这很简单,可能已经有人问过了,但我找不到(如果是这样,我很抱歉问)。

我想在表中插入一个空行,以便通过 ExecuteScalar 获取其 ID(主键,由插入触发器生成)。数据稍后会在我的代码中添加到其中。

我的问题是:是否有特定的插入语法来创建空记录?还是我必须使用常规插入语法,例如“INSERT INTO 表(列出所有列)值(每列为空)”?

感谢您的回答。

更新:在 Oracle 中,插入时的 ExecuteScalar 仅返回 0。最终答案是下面发布的内容的组合。首先,您需要声明一个参数,并使用 RETURNING 获取它。

INSERT INTO TABLENAME (ID) VALUES (DEFAULT) RETURNING ID INTO :parameterName

查看link 了解更多信息。

【问题讨论】:

    标签: oracle oracle11g


    【解决方案1】:

    您不必指定每一列,但您可能无法创建“空”记录。检查表上的 NOT NULL 约束。如果没有(不包括主键约束),那么您只需要提供一列。像这样:

    insert into my_table ( some_column )
    values ( null );
    

    你知道 RETURNING 子句吗?执行 INSERT 时,您可以将该 PK 返回给调用应用程序。

    insert into my_table ( some_column )
    values ( 'blah' ) 
    returning my_table_id into <your_variable>;
    

    我会质疑这种方法。为什么要创建一个空行?这将/可能意味着该表没有任何限制,如果您想要好的、干净的数据,这是一件坏事。

    【讨论】:

    • 感谢您的回答。我知道空唱片听起来像是一种错误的做法。长话短说,我需要一个空行,以便在我的代码此时可以将其 ID 保存在另一个表中。然后,此 ID 用作用户稍后可以保存的其他数据的参考,但是在保存其他表相关的类的实例时需要它。因此需要一个空行。
    • 所以你要先保存依赖表(类)中的数据,并且需要 PK 作为 FK 使用? (只是好奇,无需回复)
    • 不,我不知道 returning 子句,因此 +1 让我知道,.. :)
    【解决方案2】:

    基本上,为了插入一个行,其中所有列的值都是NULL,除了主要的

    键列的值你可以执行一个简单的insert 语句:

    insert into your_table(PK_col_name)
      values(1);                          -- 1 for instance or null
    

    负责填充主键列的插入前触发器将

    覆盖insert 语句的values 子句中的值,留下一个

    空记录 PK 值除外。

    【讨论】:

    • +1 但是使用DEFAULT 可能比使用硬编码值更好。然后无论类型如何,插入都将起作用,并且如果将表更改为使用 SYS_GUID() 技巧或新的 12c 序列默认值,插入也将起作用。
    • 太棒了!我结合了两个答案(将 DEFAULT 作为值插入 PK 列),它完全按照我想要的方式工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多