MySQLのデータベースの主キーを単一のものから複合キーに変更したい場合の設定について教えて下さい。


MySQLサーバーをローカルフォルダに立ち上げ、ODBC Connector3.5.1を使用して接続して利用しています。

さて、MySQLサーバーを立ち上げる際、コマンドプロンプトから以下のmysqlの命令を出しました。
このテーブル(A001M)は正常に作成され、問題なく動いていました。

create table A001M
(
人間 varchar(10)
,特技 varchar(40)
,所属グループ varchar(10)
,CONSTRAINT KEY_NAME PRIMARY KEY (人間)
);

この後、改訂があり、一人の「人間」が複数の「所属グループ」に所属する場合も有りうることにしました。これに伴い、主キーを人間と所属グループの複合キーにしたいと思い、コメント欄に示すコードで改定してみたところ、重複する「人間」データを持つレコードでは「特技」「所属グループ」も重複するレコードのデータが複製され、同一になってしまうという不具合が出ました。

これを改善するにはどうしたら良いでしょうか?

お力お貸し下さい。よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/01/30 23:12:35
  • 終了:2009/02/06 23:15:03

回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/01/30 23:40:06

ポイント35pt

ODBC 経由で A001M に何か操作をした後、commit しないうちに alter しようとしていませんか?

MySQLコマンドラインから alter してみてください。


いずれにしても、MySQLのバージョン、動作環境(OS)が分からないと、回答が困難です。

id:ReoReo7

ありがとうございます。

mysqlコマンドラインからalter後にcommitしてみましたが、やはり同様の問題が生じます。

OSはWindows XP Professional

MySQLはMySQL Server 5.1です。

2009/01/31 14:35:47
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/02/01 00:02:43

ポイント35pt

テーブル名やカラム名に日本語を使っているのですか?

だとすると、英数字で再定義してみてください。

id:ReoReo7

ありがとうございます。

申し訳ありません、テーブル名やカラム名は英数字(主に大文字)で行っております。

日本語や一部の小文字は、説明のために改変しました。

2009/02/01 00:45:14
  • id:ReoReo7
    試したこと:以下のコード1やコード2を、コマンドプロンプトから、テーブルをcreateしてうまくいった時と同じ環境で、mysqlの命令として実行してみました。

    コード1:
    drop table A001M;
    create table A001M
    (
    人間 varchar(10)
    ,特技 varchar(40)
    ,所属グループ varchar(10)
    ,CONSTRAINT KEY_NAME PRIMARY KEY (人間,所属グループ)
    );

    コード2:
    alter table A001M drop primary key;
    alter table A001M add PRIMARY KEY (人間,所属グループ)


    問題点:

    上記により、以前は許されなかったデータ
    人間,特技,所属グループ
    001,001,001
    001,002,002
    003,003,003

    の入力が可能になったはずです。

    しかし、上記データをEXCEL VBAからODBC3.5.1 Connectorを用いて接続したMySQLに対してSQLクエリを実行し、書き込みますと、Accessにて確認しても

    人間,特技,所属グループ
    001,001,001
    001,001,001
    003,003,003

    のように、「人間」が一致するレコードについてはその他のフィールドのデータも複製されてしまい、主キーを複合キーにできていません。

    同様に、Accessから直接テーブルを表示し、値を書き換えても(2行目の人間以外のレコードを変更したとしても)、他のレコードを選択(クリック)した瞬間に、1行目のデータが2行目に複製されてしまい、重複データをそもそも登録できなくなっています。


    尚、A001Mと一緒に以下のコードで生成したテーブルA002Mは、複合キーに対応してちゃんと動作しています。

    create table A002M
    (
    動物 varchar(10)
    ,好物 varchar(40)
    ,分類 varchar(10)
    ,CONSTRAINT KEY_NAME PRIMARY KEY (動物,分類)
    );

    尚、質問者はSQL初学者のため、親テーブル、子テーブルという概念についてあまり詳しくありませんが、これが関係しているかもしれません。
    また、A001M以外のテーブル名例えばA001MNEWのようなテーブルをコード1と同じ命令を用いて新たに生成した場合、このテーブルもやはりうまく動きます。
    最後に、A001Mのdrop文について、他テーブルからA001Mを参照しているため、dropしたとしても関係性が残っているかもしれず、これが原因かもしれないと思っています。
  • id:mj99
    1.MySQLでテーブルを作る
    2.Accessにアタッチする
    3.MySQLのテーブルの主キーを変更する。
    4.Accessでテーブルのデータを変更する。
    この手順だとデータが壊れますね(データ変更自体できないことも多い)
    Accessのアタッチテーブルは、アタッチ当時の主キー項目を記憶したままなので。
    主キーを変更したなら、再アタッチが必要ですね。
  • id:ReoReo7
    ありがとうございます。

    おかげさまで何とかごまかしが利きそうですが、将来的には複合キーをやめにしたいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません