【问题标题】:Leave column out of Oracle insert statement将列排除在 Oracle 插入语句之外
【发布时间】:2015-05-14 15:35:51
【问题描述】:

我有一个插入语句,我试图针对 Oracle 数据库运行。插入语句很简单,我只想在一列中插入一个值。该表本身有不止一列,但我只对用数据填充其中一列感兴趣。我的查询格式类似于以下格式:

insert into myTable (col1) Values (val1)

但是,这会引发以下错误:

ORA-00904: "col1": invalid identifier

我已检查以确保该列的名称正确,而我唯一的另一个想法是我的语法有问题。表上没有诸如主键之类的约束。在Oracle中执行插入语句时是否可以只向某些列插入值?

【问题讨论】:

  • 您说该列的名称正确,Oracle 说它不正确。在您没有任何证据的情况下,我倾向于相信 Oracle。
  • col1 是你表的主键吗?

标签: oracle


【解决方案1】:

检查您没有在创建表时引用列名。如果您这样做了,列名将按照您引用的方式存储。例如:

create table table1 (
id number(2)
)

与此有不同的列名

create table table2 (
"id" number(2)
)

默认情况下,Oracle 以大写形式存储(不带引号的)列名。引用的内容按原样存储。

您可以使用DESC table_name 查看列的存储方式。

以下

select id from table1
select iD from table1
select ID from table1

获取记录,而仅

select "id" from table2

将获取记录。

select id from table2

会抛出ORA-00904 : "ID" : invalid identifier 错误。

您可能在创建过程中使用以下工具时无意中进行了引用:

https://community.oracle.com/thread/2349926

顺便说一句:是的,可以只为一列插入记录,只要其他列没有NOT NULL 约束。

【讨论】:

    【解决方案2】:

    实际上,尽管您的示例具有误导性,但我认为您可能会在插入语句中双引号(而不是在创建表时)引用该列。我猜这是因为你的错误,它说“col1”无效,而不是“COL1”无效。考虑这个简单的测试:

    SQL> create table mytable
    (
    col1 varchar2(10)
    )
    Table created.
    SQL> -- incorrect column name, without double quotes
    SQL> insert into mytable(col2) values ('abc')
    insert into mytable(col2) values ('abc')
    Error at line 9
    ORA-00604: error occurred at recursive SQL level 1
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 11
    ORA-00904: "COL2": invalid identifier
    SQL> -- incorrect column name, with double quotes
    SQL> insert into mytable("col2") values ('abc')
    insert into mytable("col2") values ('abc')
    Error at line 12
    ORA-00604: error occurred at recursive SQL level 1
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 11
    ORA-00904: "col2": invalid identifier
    SQL> -- correct column name, without double quotes (works)
    SQL> insert into mytable(col1) values ('abc')
    1 row created.
    SQL> -- correct column name, with double quotes (fails)
    SQL> insert into mytable("col1") values ('abc')
    insert into mytable("col1") values ('abc')
    Error at line 18
    ORA-00604: error occurred at recursive SQL level 1
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 11
    ORA-00904: "col1": invalid identifier
    

    上次失败的插入尝试是我认为您可能正在做的事情:

    insert into mytable("col1") values ...
    

    根据错误信息:

    ORA-00904: "col1": invalid identifier
    

    因此,解决方案就是删除插入中列名周围的双引号。

    【讨论】:

    • 我觉得很有可能是OP在发帖时更改了声明和错误信息中的真实姓名,并在此过程中输掉了案件;但这当然也值得一试。
    • @AlexPoole 你可能是对的,亚历克斯,不知道该相信 OP 什么;)
    【解决方案3】:

    很可能是语法错误

    Desc myTable;
    insert into myTable (col1) Values ('val1')
    

    确保 col1 是表中的有效列,并且您只是不想说“选择最左边的列”。

    编辑:在Oracle中执行插入语句时是否可以只将值插入某些列?

    是的,如果您只想插入某些列,那么只需指定它

    例如

    insert into myTable (col1, col2, col6) Values ('val1', 'val2', 'val3');
    

    这仅在列本身没有 NOT NULL 约束时才有效 - 在这种情况下,它将不允许输入值(除非再次存在默认值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多