MySQLの主キーを削除する


182

user_customersをライブMySQLデータベースの権限にマップする次のテーブルスキーマがあります。

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

user_customer_idとpermission_idの主キーを削除し、idの主キーを保持したいと思います。

コマンドを実行すると:

alter table user_customer_permission drop primary key;

次のエラーが発生します。

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

列の主キーを削除するにはどうすればよいですか?

回答:


286

インデックスがないと、オートインクリメントカラムの維持にコストがかかりすぎます。そのMySQLため、オートインクリメントカラムをインデックスの左端に配置する必要があります。

キーを削除する前に、autoincrementプロパティを削除する必要があります。

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

PRIMARY KEY3つの列すべてをカバーするコンポジットがあり、id一意であることが保証されていないことに注意してください。

それはユニークであることを起こる場合は、それがために作ることができるPRIMARY KEYAUTO_INCREMENT再び:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

次に、id列をauto_increment主キーとして復元する必要はありませんか?変更テーブルuser_customer_permission主キー(id)を追加します。変更テーブルuser_customer_permission変更id id int(11)auto_increment;
markb

@markb:主キーを復元すると、それをに戻すことができますAUTO_INCREMENT
Quassnoi、2010年

これは、自動インクリメント列がPRIMARY KEYの左端の部分になることを意味します。
Arup Rakshit 2013

1
@ArupRakshit:dev.mysql.com/doc/refman/5.6/en/…InnoDB テーブルでこのAUTO_INCREMENTメカニズムを使用するには、インデックス付きルックアップと同等の機能を実行できるように、AUTO_INCREMENT列をai_colインデックスの一部として定義する必要がありSELECT MAX(ai_col)ますテーブルで最大列値を取得します。通常、これは、列をテーブルインデックスの最初の列にすることで実現されます。
Quassnoi 2013

PRIMARYは定義されていません。なぜこれが起こるのですか?主キーを指定せずにID列を削除して再度追加する必要がありました私は
mrbengi

121

1行:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

また、自動インクリメントが失われることはなく、副作用がある可能性があるため、自動インクリメントを再度追加する必要があります。


5
この回答は、フィールド定義を変更する必要がなくなるだけでなく、変更されたテーブルのfk制約による変更も可能にするため、上に浮かぶ必要があると思います-本当に助けになりました!
tomfumb

パーフェクト!自動インクリメントを取り除くためにフィールドを変更しても、私にとっては主キーの削除は機能しませんでした。しかし、このソリューションはうまく機能します!
user2447161

14

Quassnoiがあなたの直接の質問に答えたと思います。余談ですが、おそらくこれはあなたにとっては少し厄介な表現かもしれませんが、各フィールドに1つずつ、計3つの主キーがあるという印象を受けているようです。これはそうではありません。定義により、主キーは1つしか持てません。ここにあるのは、3つのフィールドの複合である主キーです。したがって、「列に主キーをドロップする」ことはできません。主キーを削除することも、削除しないこともできます。1つの列のみを含む主キーが必要な場合は、3つの列に既存の主キーをドロップし、1つの列に新しい主キーを作成できます。




5

「主キーを復元する場合は、AUTO_INCREMENTに戻すことができます」

ID列の「PKプロパティを復元する」と「自動インクリメントプロパティを復元する」ことが望ましいかどうかについては、疑問の余地はありません。

テーブルの以前の定義では自動インクリメントであったことを考えると、ID値を提供せずにこのテーブルに挿入するプログラムが存在する可能性が高くなります(ID列はとにかく自動インクリメントされるため)。

そのようなプログラムの操作は、autoincrementプロパティを復元しないことによって中断します。


3

最初に列を変更して、次のようにauto_incrementフィールドを削除します。

次に、主キーを削除します。表user_customer_permissionの主キーを削除します。



1

同じ問題があり、テーブル内のいくつかの値の横にありました。私は主キーを

ALTER TABLEuser_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY (id)

サーバーで引き続き問題が発生します。テーブル内に新しいフィールドを作成し、値を新しいフィールドに転送して古いフィールドを削除しました。問題は解決しました!!


1

列に主キーを追加します。

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

テーブルから主キーを削除します。

ALTER TABLE table_name DROP PRIMARY KEY;

0

最初にデータベースをバックアップします。次に、テーブルに関連付けられているすべての外部キーを削除します。外部キーテーブルを切り捨てます。現在のテーブルを切り捨てます。必要な主キーを削除します。sqlyog、workbench、heidisql、dbeaver、phpmyadminのいずれかを使用してください。


0

SQLマネージャーでテーブルを見つけて右クリックしてデザインを選択し、小さなキーのアイコンを右クリックして[主キーの削除]を選択します。


この投稿は問題を解決する可能性がありますが、スクリーンショットを含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたが見ている同じUIを知らないかもしれません。
海賊X
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.