Select Oracle 插入语句中的外键

Select foreign key inside insert statement Oracle

我在我的 .NET Core 项目中使用 MySQL,现在我刚切换到 Oracle 19c。我有一个很大的插入作业,它被分成块,每个块由一个事务处理。这些插入语句是相关的。我的意思是,首先我插入父行,然后插入具有如下关系的子行:

INSERT INTO PARENT (NAME, DESCRIPTION, UNIQUE_IDENTIFIER) 
            VALUES ('PARENT NAME', 'THIS IS THE PARENT', 1);
INSERT INTO CHILD (NAME, DESCRIPTION, PARENTID) 
            VALUES ('CHILD ONE', 'NEWBORN CHILD', 
                        (SELECT ID 
                        FROM PARENT 
                        WHERE UNIQUE_IDENTIFIER = 1));

这在 MySQL 上有效,但在 Oracle 中无效,它 returns 出现“数字无效”错误。有没有一种方法可以在 Oracle 中执行此操作,或者有一种方法可以获取最后插入的行 ID 或类似的东西? Parent ID 是一个自动递增序列,所以我现在不知道执行前的值。

谢谢

如果你

可能会有帮助
  • post编辑了表格的描述
  • 没有post您自己对 Oracle 错误消息的解释。他们有自己的代码,所以您应该 post 编辑它,这样我们才能确切地知道发生了什么。因为,没有“号码无效”错误。

我编了自己的例子。由于我的数据库是 11gXE,它不支持标识列(自动生成),因此我创建了一个序列和一个触发器,它们具有相同的目的;无视那个。

表格:

SQL> create table parent
  2    (id                number constraint pk_par primary key,
  3     name              varchar2(20),
  4     description       varchar2(20),
  5     unique_identifier number
  6    );

Table created.

SQL> create sequence seqpar;

Sequence created.

SQL> create or replace trigger trg_bi_par
  2    before insert on parent
  3    for each row
  4  begin
  5    :new.id := nvl(:new.id, seqpar.nextval);
  6  end;
  7  /

Trigger created.

SQL> create table child
  2    (name             varchar2(20),
  3     description      varchar2(20),
  4     parentid         number constraint fk_chpar references parent (id)
  5    );

Table created.

插入行,就像您所做的那样:

SQL> insert into parent (name, description, unique_identifier)
  2    values ('parent name', 'this is the parent', 1);

1 row created.

SQL> insert into child (name, description, parentid)
  2    values ('child one', 'newborn child',
  3            (select id from parent where unique_identifier = 1));

1 row created.

SQL>

如您所见,如果操作正确,不会出错。


那么,您的代码可能有什么问题?我怀疑至少有一列——应该接受数值——被插入了一个字符串。例如:

SQL> create table test (id number);

Table created.

SQL> insert into test values ('A');
insert into test values ('A')
                         *
ERROR at line 1:
ORA-01722: invalid number


SQL>

ORA-01722: invalid number 最接近您描述的“号码无效”。


如果不是这种情况,请按照我在上面告诉你的那 2 个项目符号中的说明进行操作。