2013-07-17 64 views
0

我们从一个项目表开始,很快意识到我们需要多个表来表达我们想要做的事情。用另一个表中的唯一值更新一个表?

我们开始切换,但现在我想完全从一个表切换到多个。

我现在拥有的一切:

TABLE: CONTACT 
+-----+-------+--------+----------+ 
| id | fname | lname | phone | 
+-----+-------+--------+----------+ 
| 123 | John | Doe | 555-1234 | 
| 124 | Mary | Shelly | 555-5857 | 
| 125 | Jane | Doe | NULL  | 
+-----+-------+--------+----------+ 

TABLE: PHONE 
+----+--------+----------+------+ 
| id | con_id | phone | main | 
+----+--------+----------+------+ 
| 1 | 125 | 555-5857 | N | 
+----+--------+----------+------+ 

因此,我们必须添加和更改的那几个。现在,我需要从CONTACT表中添加所有尚未存在于PHONE表中的数据。我这样做,有一个临时表:

TABLE: temp 
+------------+----------+------+ 
| foreign_id | phone | main | 
+------------+----------+------+ 
| 123  | 555-1234 | Y | 
| 124  | 555-4153 | Y | 
| 125  | 555-5857 | N | 
+------------+----------+------+ 

但是,当我从临时添加到手机,我结束了重复的条目(在本例中,其中contact.id = 125)。

这就是我试图去:

TABLE: CONTACT 
+-----+-------+--------+ 
| id | fname | lname | 
+-----+-------+--------+ 
| 123 | John | Doe | 
| 124 | Mary | Shelly | 
| 125 | Jane | Doe | 
+-----+-------+--------+ 


TABLE: PHONE 
+----+--------+----------+------+ 
| id | con_id | phone | main | 
+----+--------+----------+------+ 
| 1 | 125 | 555-5857 | N | 
| 2 | 123 | 555-1234 | Y | 
| 3 | 124 | 555-4153 | Y | 
+----+--------+----------+------+ 

命令我已经运行:

create temporary table temp (select t2.id, phone from contact t2); 
alter table temp add main varchar(1); 
update temp set main = "Y"; 

insert into phone (con_id, phone, main) select id, phone, main from temp; 
drop table temp; 

最终,我会删除列 “手机”从接触。问题是,如果表格中已经有一个电话号码的条目,我剩下的是重复的。 我该如何预防?

此外,如果我做错了,我也可以改变这一点。我只是认为临时表可能是最好的方式?

回答

2

您可以通过添加一个主键(或唯一键)的电话表避免重复:

ALTER TABLE phone ADD PRIMARY KEY (con_id); 

这将确保你对每个CON_ID只有一个条目。如果你想允许多个电话号码为每个CON_ID,你应该使用:

ALTER TABLE phone ADD PRIMARY KEY (con_id, phone); 

现在,您可以直接从联系人表中插入项 - 或你的临时表,如果你已经放弃了手机您的联系表列:

REPLACE INTO phone (con_id,phone,main) 
    SELECT id, phone, "Y" FROM contact; 

或者,你可以使用INSERT ...对重复密钥更新...施工。 如果您不想覆盖但保留原始的非主键值,则可以改为使用INSERT IGNORE。

有关INSERT语法的更多详情,请咨询:http://docs.oracle.com/cd/E17952_01/refman-5.1-en/insert.html

+0

INSERT忽视的是去我觉得(有可能是一个人的多个电话号码)的方式。 – Jeff

+0

如果可能有多个电话号码,则主键(或唯一键)应该是con_id,电话。如果你想同时更新“main”字段,你应该使用“REPLACE”,如果你想保留“main”中的值,你可以很好地使用“INSERT IGNORE”,它会更快。 – Ursula

+0

所以我不需要临时表吗? – Jeff

相关问题