0

DB スキーマをアップグレードしています。テーブルは 2 つのテーブルに分割されます。これら 2 つのテーブルはリンクされており、それらをリンクする唯一の方法は、元のテーブルの varchar name フィールドを使用することです。

問題は、名前がプライマリ キーまたは一意のキーではないため、顧客の名前が重複している可能性があることです。

2 つの新しいリンクされたテーブルにデータを移動するときにキーとして使用できるように、これらの名前を一意にするアイデアを探してここに来ました。

これを書いているとき、現在の PK を CONCAT して名前を付け (CONCAT(name,id) as newName のように)、これをキーとして使用するという考えがありました。

一意のコード フィールドもありますが、これは新しいテーブルの 1 つにしか入りません。

スキーマの例:

tableA
a_id INT(11) PRI AUTO_INCREMENT
code VARCHAR(10) UNIQUE 
name VARCHAR(30) NOT NULL

newTableB
b_id INT(11) PRI AUTO_INCREMENT
name VARCHAR(30)

newTableC
c_id INT(11) PRI AUTO_INCREMENT
b_id INT(11) FK->newTableB
code VARCHAR(10) UNIQUE 

私が欲しいもの:

  1. 新しい b_id を生成 (auto_increment)
  2. tableA.name からインポートされた newTableB.name
  3. tableA.code からインポートされた newTableC.code
  4. tableA.a_id からインポートされた newTableC.c_id

a_id は、同じままである別の 4 番目のテーブルの FK です。上記の変更後、c_id はこの 4 番目のテーブルで有効な FK になります。

私の課題: これらの新しいテーブルに挿入し、元の名前<->コード<->a_id の関係を維持し、tableA.a_id の値を newTableC.c_id に転送するにはどうすればよいでしょうか。b_id が新しい auto_incr を取得してもかまいません。値。

私が問題をどの程度明確にしているかはわかりませんが、お気軽に質問してください。

ありがとうダン

4

2 に答える 2

1

私は通常、このようなタスクをいくつかの部分で行ってきました。最初にテーブル b に挿入しますが、名前の代わりに a の id フィールドを名前列に入れます。次に、データをテーブル a から tablec に挿入します。次に、a.id フィールドと b.name フィールドでテーブル a に結合して、テーブル b の名前フィールドを更新します。しかし、mysql の更新で結合を使用できるかどうかはわかりません。そこにデータがあれば、ステートメントを書く方法になるはずです。

または、テーブル b に tableid という名前の列を一時的に追加します。次に、a id を含むデータを tableb に入れ、それを使用してテーブル a に結合し、テーブル c の b.id とテーブル A のデータを取得します。完了したら、テーブル b から tableA 列を削除します。

于 2012-04-11T21:51:25.470 に答える
0

これはどう

CREATE TABLE temp_newTableB AS (SELECT * FROM newTableB);
DELETE FROM newTableB WHERE b_id NOT IN (SELECT b_id FROM temp_newTableB GROUP BY name);
DROP TABLE temp_newTableB ;

しかし、上記のクエリによって重複した名前の一部が削除されるため、どちらb_idを保持するかを決定するルールはありますか??newTableCb_idnewTableB

于 2012-04-11T21:51:06.373 に答える