2017-03-07 9 views
0

私は2つのテーブルを持っています。まず一つは、犬です:キーと外部キーの変更

oldId name 
----- ----- 
'AX01' Fido 
'AX02' Pluto 
...  .... 

やサービスと呼ばれる別:

Id ServicedDog Descripton 
--- ------------ ---------- 
1 'AX01'  'Dog bath' 
2 'AX01'  'Dog Vaccined' 
... 
22 'AX02'  'Dog bath' 
... 

我々が持っている問題は、我々はインクリメントautoにテーブル犬のoldId列(CHAR(4))に変換する必要があるということですINT値を更新し、サービスされたテーブルのそれぞれのServicedDogカラムを新しい値(外部キー)に更新します。私が持っているもう一つの問題は、ServicedDogのデータ型がCHAR(4)であり、この列のデータ型をINTに変更する必要があることです。どうか、どうすればいいの? おかげ

答えて

0

は(あなたが持っているもののためSHOW CREATE TABLEを見なければ、私はいくつかの推測を作っています。)

それは本当に今oldidと呼ばれていますか?

-- Add the desired id (and populate it); 
-- Replace the existing PK: 
ALTER TABLE dogs 
    ADD COLUMN id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, 
    DROP PRIMARY KEY, 
    ADD PRIMARY KEY(id) 
    ADD INDEX(oldid); 

-- add new dog_id (but do not populate) 
ALTER TABLE serviced 
    ADD COLUMN dog_id SMALLINT UNSIGNED NOT NULL, 
    ADD INDEX(dog_id); 

-- establish new linkage: 
UPDATE serviced 
    JOIN dogs ON serviced.oldid = dogs.oldid 
    SET serviced.dog_id = dogs.id; 

注:

  • oldidは本当にその列の現在の名前であると仮定します。
  • これまでに64K個の犬しかいないと仮定します(SMALLINT UNSIGNED)。あなたがもっと持っている場合は、宣言を変更してください。
  • インデックスをoldidに保存します。インデックスを削除したり、列を削除することもできます。
+0

実際には、その古いIdは真のDB(ああ男!)でIdと呼ばれています。私の間違い。 –

+0

その後、 'ALTERs'は残りの手順を実行する前にidの名前をoldidに変更する必要があります。 –