40

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列を維持する方法があります)?

4

6 に答える 6

65

インデックス(キー)がある限り、ではない自動インクリメント列を作成できます。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; 
于 2011-11-13T21:44:21.610 に答える
18

まず、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 ;
于 2017-01-20T06:30:02.313 に答える
4

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

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

ただし、パフォーマンスが非常に重要な場合は、視覚的に非常に便利なように、テーブルを1行あたり4バイト拡張することを2度検討する必要があります。さらに、外部キー制約を適用するためにINNODBに切り替えると、MySQLはクラスター化インデックスで主キーを使用します。主キーを使用していないので、パフォーマンスが低下する可能性があると思います。

于 2011-11-13T21:40:50.393 に答える
2

私はあなたのエラーの理由を理解していると思います。まず、[自動増分]フィールドをクリックしてから、主キーとして選択します。

正しい方法は最初です。主キーとして選択してから、[自動増分]フィールドをクリックする必要があります。

非常に簡単。ありがとう

于 2016-10-16T14:12:07.003 に答える
1

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

于 2015-01-28T09:16:56.730 に答える
1

このスレッドを読みながら、この解決策を特定しました。おそらく次の人のためにこれを投稿する考えられたid。

パッケージからのLaravel移行ファイルを処理するとき、私はこの問題に遭遇しました。

私の古い価値は

$table->increments('id');

私の新しい

$table->integer('id')->autoIncrement();
于 2020-10-12T01:37:14.430 に答える