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列を保持する方法がありますか?
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;
最初に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 ;
Idを主キーにし、member_idをNOT NULL UNIQUE
に設定できます。 (完了しました。)NOT NULL UNIQUE
である列は、主キーと同様に、外部キー参照のターゲットにできます。 (これはすべてのSQLプラットフォームに当てはまると確信しています。)
概念的なレベルでは、PRIMARY KEY
とNOT NULL UNIQUE
の間に違いはありません。物理レベルでは、これはMySQLの問題です。他のSQLプラットフォームでは、シーケンスを主キーにせずに使用できます。
ただし、パフォーマンスが本当に重要な場合は、視覚的な利便性を高めるために、行ごとに4バイトずつテーブルを拡張することをよく考えてください。さらに、外部キー制約を強制するためにINNODBに切り替えると、MySQLはクラスター化インデックスの主キーを使用します。主キーを使用していないため、パフォーマンスが低下する可能性があります。
上記の問題について、まずテーブルに複数のプライマリキーが含まれている場合、最初にすべてのプライマリキーを削除し、最初のAUTO INCREMENTフィールドをプライマリキーとして追加してから、以前に削除された別の必要なプライマリキーを追加します。オプション領域の必須フィールドにAUTO INCREMENTオプションを設定します。
私はあなたのエラーの理由を理解していると思います。最初に[自動インクリメント]フィールドをクリックしてから、それを主キーとして選択します。
正しい方法は、まずそれを主キーとして選択する必要があります。次に、[自動インクリメント]フィールドをクリックする必要があります。
非常に簡単。ありがとう