簡體   English   中英

MySQL:#1075 - 不正確的表定義; 自動增量與另一個鍵?

[英]MySQL: #1075 - Incorrect table definition; autoincrement vs another key?

這是 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 - 不正確的表定義; 只能有一個自動列,並且必須將其定義為鍵

如果性能非常重要(盡管磁盤空間不是),最好的選擇是什么(希望有一種方法可以保留 id 列,以便性能良好並且查詢通過 memberid 而不是 id 識別任何用戶)?

可以擁有一個不是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 KEYNOT NULL UNIQUE之間沒有區別。 在物理層面,這是一個 MySQL 問題; 其他 SQL 平台將允許您使用序列而不將其設為主鍵。

但是,如果性能真的很重要,那么您應該三思而后行,為了這種微小的視覺方便,將表格每行擴大 4 個字節。 此外,如果您切換到 INNODB 以強制執行外鍵約束,MySQL 將在聚集索引中使用您的主鍵。 由於您沒有使用主鍵,我想這可能會影響性能。

我想我明白你的錯誤的原因。 首先單擊 auto AUTO INCREMENT 字段,然后選擇它作為主鍵。

正確的方法是首先您必須選擇它作為主鍵,然后您必須單擊自動 AUTO INCREMENT 字段。

好簡單。 謝謝

對於上述問題,首先,如果假設表包含 1 個以上的主鍵,則首先刪除所有這些主鍵並添加第一個 AUTO INCREMENT 字段作為主鍵,然后添加另一個需要的主鍵,該主鍵之前已刪除。 從選項區域為必填字段設置 AUTO INCREMENT 選項。

在閱讀此線程時確定了此解決方案。 想 id 可能會為下一個人發布這個。

在處理包中的 Laravel 遷移文件時,我遇到了這個問題。

我的舊價值是

$table->increments('id');

我的新

$table->integer('id')->autoIncrement();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM