MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

AUTO_INCREMENT列からPRIMARY KEY制約を削除しようとするとどうなる?MySQLのエラーを徹底解説

MySQLでは、AUTO_INCREMENT属性を持つ列には必ずPRIMARY KEYなどのキー制約が必要です。これはMySQLの仕様として定められているため、AUTO_INCREMENT列からPRIMARY KEY制約を削除しようとすると、「テーブル定義が不正である」という内容のエラーが返されます。

本記事では、実際にエラーが発生する様子を具体例とともに解説します。

検証例:「Accounts」テーブルの場合

まず、次のような構造を持つ「Accounts」テーブルを用意します。

mysql> Describe accounts;

+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| Sr     | int(10)     | NO   | PRI | NULL    | auto_increment |
| Name   | varchar(20) | YES  |     | NULL    |                |
| amount | int(15)     | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+

3 rows in set (0.10 sec)

このテーブルの「Sr」列には、AUTO_INCREMENTとPRIMARY KEYの両方が定義されています。この状態でPRIMARY KEYを削除するALTER文を実行してみましょう。

mysql> Alter table Accounts DROP PRIMARY KEY;
ERROR 1075 (42000): Incorrect table definition; there can be only one
    auto column and it must be defined as a key

エラーの意味

実行結果として、ERROR 1075 (42000) というエラーが発生しました。エラーメッセージの内容は「テーブル定義が不正:オートインクリメント列は1つだけしか存在できず、かつキーとして定義されなければならない」というものです。

つまり、AUTO_INCREMENT列は必ず何らかのキー(通常はPRIMARY KEY)として定義されている必要があり、キー制約を外した状態ではテーブル定義として成立しないため、MySQLが変更を拒否しているのです。

対処方法

もしAUTO_INCREMENT属性を解除したい場合は、先にMODIFY句を使って該当列からauto_increment属性を削除してから、PRIMARY KEY制約を削除する必要があります。逆に言えば、AUTO_INCREMENTを維持したままPRIMARY KEYだけを取り除くことはできません。


  1. MySQLで主キー(プライマリーキー)を削除する方法をわかりやすく解説

    MySQLでテーブルから主キー(プライマリーキー)を削除するには、ALTER TABLE文を使用します。DROP PRIMARY KEY句を組み合わせることで、既存の主キーを簡単に削除できます。 基本構文 ALTER TABLE テーブル名 DROP PRIMARY KEY; それでは、実際にサンプルテーブルを使って手順を確認していきましょう。 手順1:サンプルテーブルを作成する まず、主キーを持つテーブルを作成します。 mysql> CREATE TABLE DemoTable -> ( -> StudentId int NOT NULL, -

  2. MySQLでテーブルの値からランダムに2件のレコードを取得する方法

    MySQLでランダムにレコードを抽出するには、ORDER BY RAND()を使用します。さらに、取得する件数を2件に限定したい場合は、LIMIT 2を組み合わせることで実現できます。この記事では、実際にテーブルを作成し、ランダムに2つの値を取得する手順を具体的な例とともに解説します。サンプルテーブルの作成まず、質問文を格納するテーブルを作成しましょう。mysql> create table DemoTable1815 ( Question text ); Query OK, 0 rows affected (0.00 sec)テストデータの挿入次に、INSERT