在Oracle中为几列添加唯一ID

时间:2014-10-20 14:34:31

标签: sql oracle triggers

首先,这个问题来自我公司的数据库,我无法改变这个表的结构,因为它会影响其他项目。

我有一个包含5列的表T_CONTACT:CTO_RECNUM,CTO_COMPANY,CTO_NAME,CTO_TYPE,CTO_INFO。

此表格中的每一行代表一个联系人信息。

例如,在表中我们有:

CTO_RECNUM  CTO_COMPANY     CTO_NAME    CTO_TYPE    CTO_INFO
---------------------------------------------------------------------------------
12435       HIS COMPANY     Mr. SCOTT   'TEL'       'phone_number_here'
12436       HIS COMPANY     Mr. SCOTT   'FAX'       'fax_number_here'
12437       HIS COMPANY     Mr. SCOTT   'EML'       'email_adresse_here'
12438       OTHER COMPANY   Mr. PAUL    'FAX'       'fax_number_here'

我想添加一个新列,以便为两列(CTO_COMPANY,CTO_NAME)提供唯一ID。

我想有类似的东西:

CTO_RECNUM  CTO_COMPANY     CTO_NAME    CTO_TYPE    CTO_INFO
-----------------------------------------------------------------------------------------
12435       HIS COMPANY     Mr. SCOTT   'TEL'       'phone_number_here'     1
12436       HIS COMPANY     Mr. SCOTT   'FAX'       'fax_number_here'       1
12437       HIS COMPANY     Mr. SCOTT   'EML'       'email_adresse_here'    1
12438       OTHER COMPANY   Mr. PAUL    'FAX'       'fax_number_here'       2

最后一列代表新列。

我添加了一个“CTO_ID”列,我试图在此表上设置一个触发器:

create or replace 
trigger T_TRG_ADD_CTO_ID
before insert or update on T_CONTACT
for each row
declare
    CTO_PREV number;
begin
  select CTO_ID into CTO_PREV from T_CONTACT
  where CTO_COMPANY=:NEW.CTO_COMPANY and CTO_NAME=:NEW.CTO_NAME;

    if(CTO_PREV is not null) then
     :NEW.CTO_ID:=CTO_PREV;
    else
     :NEW.CTO_ID:=T_SEQ_CTO_ID.NEXTVAL;
    end if;
end;

在插入或更新行之前,我尝试在表中查找是否已设置CTO_ID 对于当前行(将插入或更新的行)的情侣(CTO_COMPANY,CTO_NAME)。

如果找到值,则将其放入:NEW.CTO_ID。如果没有,我从我创建的序列中获取一个值。

我认为这足以解决我的问题,但此触发器会返回异常:Mutating table。经过研究,我发现我不允许从同一触发器中使用的表中选择数据。

拜托,您能帮我找到解决问题的方法吗?

0 个答案:

没有答案