Oracle 插入值并将其替换为来自另一个 table 的主键值

Oracle insert and replace value with it's primary key value from another table

我有两个table。

TABLE2 有字段 CODE_NM 和 DESCRIPTION。 CODE_NM 是此 table 中的主键,也是此 table 的 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');

而不是 'description 1 text',我想显示主键,即“001”:

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

这可以使用触发器来完成吗?

您可以创建触发器

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;

您可以为 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 的值)之间进行精确匹配

这是最终起作用的:

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;