2011-11-13 61 views
20

はここでのMySQL 5.3.X + DB内のテーブルです:MySQL:#1075 - 不正なテーブル定義。オートインクリメントと別のキー

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; 

同上列がクエリで使用されることはありません、それだけで視覚的利便性のためである(それは、テーブルの成長方法を確認するのは簡単です)。 Memberidは実際のキーであり、一意であり、任意のメンバー(WHERE memberid = 'abcde')を識別するためのクエリではというメンバーIDが使用されます。

私の質問は:どのようにauto_incrementを維持するが、主キーとしてメンバーIDを作るか?それは可能ですか? 私はPRIMARY KEY(MEMBERID)でこのテーブルを作成しようとすると、私はエラーを取得:

1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

最良の選択は、(うまくいけば、パフォーマンスが良いので、id列を維持する方法がありますされて何とクエリはパフォーマンスが非常に重要であれば(ディスク容量はありませんが)、idではなくmemberidで任意のユーザを識別しますか?

答えて

41

あなたは、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; 
+0

+1とコメントのおかげで、今日何かを学んだ:) –

4

idを主キーにし、member_idをNOT NULL UNIQUEに設定できます。 (これまで行ってきたことです)NOT NULL UNIQUEという列は、主キーと同様に、外部キー参照の対象にすることができます。 (私はすべてのSQLプラットフォームに当てはまると確信しています)

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

パフォーマンスが本当に重要な場合は、その小さな視覚的便利のために、1行につき4バイトずつテーブルを2倍に広げることを2度考えなければなりません。さらに、外部キー制約を適用するためにINNODBに切り替えると、MySQLはクラスタ化インデックスでプライマリキーを使用します。主キーを使用していないので、パフォーマンスが低下する可能性があります。

0

、最初のすべて仮定する場合表に1つ以上の主キーが含まれている場合は、最初にこれらの主キーをすべて削除し、最初のAUTO INCREMENTフィールドを主キーとして追加し、先に削除された別の必須主キーを追加します。オプション領域から必要な項目のAUTO INCREMENTオプションを設定します。

0

私はあなたのエラーの理由を理解すると思います。 まず、AUTO AUTO INCREMENTフィールドをクリックし、主キーとして選択します。

The Right way is First You have to select it as a primary key then you have to click auto AUTO INCREMENT field.

非常に簡単です。 おかげ

まずAUTO_INCREMENTせずにテーブルを作成
4

、指標として設定したIDの後

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; 

、AUTO_INCREMENTとして設定したIDの後

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

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 ; 
関連する問題