web-dev-qa-db-ja.com

MySQL:#1075-不正なテーブル定義。自動インクリメントvs別のキー?

MySQL 5.3.X + dbの表は次のとおりです。

CREATE TABLE members` (
  `id` int(11)  UNSIGNED NOT NULL AUTO_INCREMENT,
  `memberid` VARCHAR( 30 ) NOT NULL ,
  `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  `firstname` VARCHAR( 50 ) NULL ,
  `lastname` VARCHAR( 50 ) NULL ,
  UNIQUE (memberid),
  PRIMARY KEY (id) 
) ENGINE = MYISAM;

Id列はクエリで使用されることはありません。視覚的な利便性のためだけです(したがって、テーブルがどのように成長するかを簡単に確認できます)。 Memberidは実際のキーであり、一意です。memberidは、クエリでメンバーを識別するために使用されます(WHERE memberid = 'abcde')。

私の質問は、auto_incrementを保持しながら、memberidを主キーにする方法です。それは可能ですか? PRIMARY KEY(memberid)でこのテーブルを作成しようとすると、エラーが発生します。

1075-誤ったテーブル定義。自動列は1つのみで、キーとして定義する必要があります

パフォーマンスが非常に重要な場合(ディスク領域はそうではないが)、パフォーマンスが良好で、クエリがidではなくmemberidでユーザーを識別するように、id列を保持する方法がありますか?

26
Haradzieniec

canにインデックス(キー)がある限り、PRIMARY KEYではない自動インクリメント列があります。

CREATE TABLE members ( 
  id int(11)  UNSIGNED NOT NULL AUTO_INCREMENT,
  memberid VARCHAR( 30 ) NOT NULL , 
  `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
  firstname VARCHAR( 50 ) NULL , 
  lastname VARCHAR( 50 ) NULL , 
  PRIMARY KEY (memberid) ,
  KEY (id)                          --- or:    UNIQUE KEY (id)
) ENGINE = MYISAM; 
48
ypercubeᵀᴹ

最初にauto_incrementなしでテーブルを作成し、

CREATE TABLE `members`(
    `id` int(11) NOT NULL,
    `memberid` VARCHAR( 30 ) NOT NULL ,
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    `firstname` VARCHAR( 50 ) NULL ,
    `lastname` VARCHAR( 50 ) NULL
    PRIMARY KEY (memberid) 
) ENGINE = MYISAM;

idをインデックスとして設定した後、

ALTER TABLE `members` ADD INDEX(`id`);

idをauto_incrementとして設定した後、

ALTER TABLE `members` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT;

または

CREATE TABLE IF NOT EXISTS `members` (
    `id` int(11) NOT NULL,
    `memberid` VARCHAR( 30 ) NOT NULL ,
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    `firstname` VARCHAR( 50 ) NULL ,
    `lastname` VARCHAR( 50 ) NULL,
      PRIMARY KEY (`memberid`),
      KEY `id` (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
12
Thilina Sampath

Idを主キーにし、member_idをNOT NULL UNIQUEに設定できます。 (完了しました。)NOT NULL UNIQUEである列は、主キーと同様に、外部キー参照のターゲットにできます。 (これはすべてのSQLプラットフォームに当てはまると確信しています。)

概念的なレベルでは、PRIMARY KEYNOT NULL UNIQUEの間に違いはありません。物理レベルでは、これはMySQLの問題です。他のSQLプラットフォームでは、シーケンスを主キーにせずに使用できます。

ただし、パフォーマンスが本当に重要な場合は、視覚的な利便性を高めるために、行ごとに4バイトずつテーブルを拡張することをよく考えてください。さらに、外部キー制約を強制するためにINNODBに切り替えると、MySQLはクラスター化インデックスの主キーを使用します。主キーを使用していないため、パフォーマンスが低下する可能性があります。

上記の問題について、まずテーブルに複数のプライマリキーが含まれている場合、最初にすべてのプライマリキーを削除し、最初のAUTO INCREMENTフィールドをプライマリキーとして追加してから、以前に削除された別の必要なプライマリキーを追加します。オプション領域の必須フィールドにAUTO INCREMENTオプションを設定します。

1
Vikram Gharge

私はあなたのエラーの理由を理解していると思います。最初に[自動インクリメント]フィールドをクリックしてから、それを主キーとして選択します。

正しい方法は、まずそれを主キーとして選択する必要があります。次に、[自動インクリメント]フィールドをクリックする必要があります。

非常に簡単。ありがとう