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 个项目符号中的说明进行操作。
我在我的 .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 个项目符号中的说明进行操作。