0

プロジェクト用に 1 つのテーブルから始めましたが、やりたいことのために複数のテーブルが必要であることにすぐに気付きました。

切り替えを開始しましたが、今は 1 つのテーブルから複数のテーブルに完全に切り替えたいと考えています。

私が今持っているもの:

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    |
+------------+----------+------+

しかし、temp から phone に追加すると、エントリが重複してしまいます (この例では、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;

そして最終的に、連絡先から「電話」列を削除します。問題は、テーブルに電話番号のエントリが既にある場合、重複が残ることです。どうすればそれを防ぐことができますか?

また、間違っている場合は、それも変更できます。一時テーブルが最善の方法かもしれないと思いましたか?

4

1 に答える 1

2

phone テーブルに主キー (または一意のキー) を追加することで、重複を避けることができます。

ALTER TABLE phone ADD PRIMARY KEY (con_id);

これにより、con_id ごとにエントリが 1 つだけになります。各 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 ... ON DUPLICATE KEY UPDATE ... 構造を使用できます。上書きせずに元の非主キー値を保持する場合は、代わりに INSERT IGNORE を使用できます。

INSERT 構文の詳細については、http: //docs.oracle.com/cd/E17952_01/refman-5.1-en/insert.htmlを参照してください。

于 2013-07-17T17:06:43.227 に答える