2011-11-13 23 views
20

這裏是在MySQL 5.3.X +數據庫表: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是一個實際的密鑰,是唯一的,並且memberid用於查詢以識別任何成員(WHERE memberid ='abcde')。

我的問題是:如何保持auto_increment,但使memberid作爲主鍵?那可能嗎? 當我嘗試創建該表與PRIMARY KEY(MEMBERID),我得到一個錯誤:

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

什麼是最好的選擇(希望有一種方法來保持的id列,因此表現不俗,查詢通過memberid而不是id來標識任何用戶),如果性能非常重要(儘管磁盤空間不是)?

回答

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平臺將允許您使用序列而不將其作爲主鍵。

但是,如果性能真的很重要,那麼您應該考慮將表格擴大爲每行四個字節,以實現微小的視覺便利。另外,如果您切換到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.

很簡單。 感謝

4

首先沒有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 ; 
相關問題