![](/img/trans.png)
[英]Error 1075: Incorrect table definition; there can be only one auto column and it must be defined as a key (using gorm and mysql)
[英]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 KEY
和NOT 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.