0

テーブル「usernames」に主キーを追加する必要があります

私はそれに3つの列があります:

userid int(10)
username char(20)
user char(50)

主キーは「ユーザー名」フィールドに設定されており、それを外部キーとして使用して別のテーブルにリンクしました。ここで、「userid」フィールドにも主キーを追加する必要があります...だから私は試しました:

alter table `usernames` drop primary key, add primary key(userid,username);

と言うエラーが表示されます

ERROR 1553 (HY000): Cannot drop index 'PRIMARY":needed in a foreign key constraint 

これを行う方法はありますか??

4

4 に答える 4

0

名前が示すように、テーブルは最大1 つの PRIMARYキーしか持つことができません。同様の効果を持つ他のUNIQUEキーを持つことができますが、それらは実際には外部キー関係に使用されるべきではありません。

したがって、次の 2 つの選択肢があります。

  • 既存のスキーマを保持します (おそらくusername、完全に優れた自然キーであるため、合成キーを気にする必要はありません。その場合、userid列を完全に削除することを検討できます)。また

  • キーを作成します。この場合、userid外部キー関係には使用しないでください。この「オフライン」を実行する方法の概要を以下に示します (移行中にデータベースが他のプロセスによって変更されないことが保証されている場合)。「オンライン」で作業している場合は、整合性を確保するためにさらに手順を追加する必要があります。PRIMARYusername

    1. すべての子テーブルに外部キー用の新しい列を追加しuserid、既存の外部キー制約を削除します。

      ALTER TABLE foo
        ADD COLUMN userid INT(10),
        DROP FOREIGN KEY fk_name;
      
    2. テーブルの主キーを変更しますusernames(データベースに一意性制約を適用させたい場合は、代わりにキーusernameを定義できます)。UNIQUE

      ALTER TABLE usernames
        DROP PRIMARY KEY,
        ADD  PRIMARY KEY (userid),
        ADD  UNIQUE  KEY (username);  -- optional
      
    3. 子テーブルを更新してuserid、親からの関連するものを含めます。

      UPDATE foo JOIN usernames USING (username)
        SET foo.userid = usernames.userid;
      
    4. 新しい外部キー制約を追加usernameし、子テーブルから古い列を削除します。

      ALTER TABLE foo
        ADD FOREIGN KEY (userid) REFERENCES usernames (userid),
        DROP COLUMN username;
      
于 2013-09-05T11:11:51.010 に答える
0

主キーを変更するには、外部キーを削除する必要があります

于 2013-09-05T10:57:22.317 に答える