我们从一个项目表开始,很快意识到我们需要多个表来表达我们想要做的事情。用另一个表中的唯一值更新一个表?
我们开始切换,但现在我想完全从一个表切换到多个。
我现在拥有的一切:
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;
最终,我会删除列 “手机”从接触。问题是,如果表格中已经有一个电话号码的条目,我剩下的是重复的。 我该如何预防?
此外,如果我做错了,我也可以改变这一点。我只是认为临时表可能是最好的方式?
INSERT忽视的是去我觉得(有可能是一个人的多个电话号码)的方式。 – Jeff
如果可能有多个电话号码,则主键(或唯一键)应该是con_id,电话。如果你想同时更新“main”字段,你应该使用“REPLACE”,如果你想保留“main”中的值,你可以很好地使用“INSERT IGNORE”,它会更快。 – Ursula
所以我不需要临时表吗? – Jeff