2013-07-17 126 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

相關問題