Oracle 用另一个表的主键值插入和替换值

Posted

技术标签:

【中文标题】Oracle 用另一个表的主键值插入和替换值【英文标题】:Oracle insert and replace value with it's primary key value from another table 【发布时间】:2020-04-03 20:28:09 【问题描述】:

我有两张桌子。

TABLE2 具有字段 CODE_NM 和DESCRIPTION。 CODE_NM 是此表中的主键和表 TABLE1 中的外键。

表 2:

|---------------------|------------------|
|      CODE_NM        |     DESCRIPTION  |
|---------------------|------------------|
|          001        |description 1 text|
|---------------------|------------------|
|          002        |description 2 text|
|---------------------|------------------|

表 1:

|---------------------|----------------------|------------------|
|      CODE_NM        |  DESCRIPTION_DETAIL  |      USER        |
|---------------------|----------------------|------------------|
|          001        |  some text in here   |      USERID      |
|---------------------|----------------------|------------------|

每次向 TABLE1 插入一行时,用户都会输入 DESCRIPTION、DESCRIPTION_DETAIL 和 USER。对于每个插入,我想用 CODE_NM 替换DESCRIPTION。 可以肯定的是,对于插入的任何说明,都会在 TABLE2 中为其关联的主键创建一个值。

所以我应该可以插入:

INSERT INTO TABLE1 (CODE_NM, DESCRIPTION_DETAIL, USER)
VALUES ('description 1 text','this it the situation','USERID');

而不是“描述 1 文本”,我想显示主键,即“001”:

|---------------------|----------------------|------------------|
|      CODE_NM        |  DESCRIPTION_DETAIL  |      USER        |
|---------------------|----------------------|------------------|
|          001        |  some text in here   |      USERID      |
|---------------------|----------------------|------------------|

这可以使用触发器吗?

【问题讨论】:

【参考方案1】:

您可以为table1 创建这样的插入前触发器:

SQL> create or replace trigger trg_tbl1_bi
  before insert on table1   
  for each row    
declare
  begin
     select code_nm
       into :new.code_nm 
       from table2 
      where trim(description) = trim(:new.code_nm);
   exception when no_data_found then 
      raise_application_error(-20001,'No matching record found!');  
  end;  
end;
/

但您需要在这些字符串之间完全匹配(table2.description 列和 :new.code_nm of table1 的值)

【讨论】:

【参考方案2】:

您可以创建触发器

create or replace trigger tbi_table2
before insert on table2
on each row
declare
begin
  :new.code_nm := select code_nm from table1 where description=:new.code_nm;
end;

【讨论】:

【参考方案3】:

这就是最终的工作:

create or replace trigger trigger_name
before insert on TABLE1
FOR EACH ROW
DECLARE
   v_code_nm table2.code_nm%type;
begin
 SELECT code_nm INTO v_code_nm FROM TABLE2 WHERE DESCRIPTION=:new.code_nm;
  :new.code_nm := v_code_nm;
end;

【讨论】:

以上是关于Oracle 用另一个表的主键值插入和替换值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库中序列(SEQUENCE)的用法详解

获取mybaties插入记录自动增长的主键值

MyBatis 插入时返回刚插入记录的主键值

Oracle与mysql区别

如何在插入新行后立即将自动生成的主键值保存到第二列

MyBatis应用记录:MyBatis如何得到插入数据之后的主键值