插入表时在Oracle DataBase中自动命名

时间:2013-06-07 06:41:32

标签: oracle auto-increment

我有两个表:table_1和table_2。 在这些表中有两列:p_code(varchar2)和o_code(varchar2),它们都是主键。所以我们有:

table_1.p_code,
table_1.o_code,
table_2.p_code,
table_2.o_code

我想将table_2复制到table_1中,但table_1中可能存在一些相同的行。我以为我可以用功能或程序处理这种情况,但我不能。我怎么处理这个?

顺便说一句:两个示例表和列:

Table_1:
P_code    O_code
C123      PREP100
C123      PREP101

Table_2:
P_code    O_code
C123      PREP101
C123      PREP102

我想将table_2插入Table_1,但Table_1中已存在C123 PREP。我以为我可以把最后三个字符拼写,trun到数字,增加一个,变成varchar2,看看是否存在于table_1中。但是我无法为它编写sql过程或函数......

2 个答案:

答案 0 :(得分:0)

这应该适用于大多数SQL引擎(SQLFiddle Demo for Oracle 11G):

INSERT INTO table_1 (p_code, o_code)
SELECT p_code, o_code FROM table_2
MINUS
SELECT p_code, o_code FROM table_1

根据您的示例,我假设您的主键是(p_code, o_code)

更新:SQL92具有标准EXCEPT运算符,但Oracle不支持它。相反,它使用MINUS,它的工作方式完全相同。

答案 1 :(得分:0)

您可以使用以下内容:

insert into table_1 (p_code, o_code)
(-- add all rows in table_2 that are not present in table_1
 (select t2.p_code, t2.o_code from table_2 t2 
 minus
 select t1.p_code, t1.o_code from table_1 t1)
 union all
 -- add all rows in table_2 that are present in table_1
 (select t2.p_code, t2.o_code || '_2' from table_2 t2
  join table_1 t1a on t2.p_code = t1a.p_code and t2.o_code = t1a.o_code)
);

这将不加改变地插入新行,并使用_2后缀现有行;然后,您可以轻松地运行UPDATE语句以生成唯一的ID,或者(最好)使用序列来生成新的ID。