配置為 PK、NN 和 AI 的 ID 列是否是我的表定義的第一列?
我有一個
.csv
包含一堆數據的文件,用於將所有數據載入到數據庫表中。該文件缺少 ID 列(因為這是通過我們的軟體管理的內部列,他們不關心它)。為了避免數據出現問題,我的“解決方案”是將列移動
id
到不干擾文件數據的位置,並且就在ActiveFlag
列之後或末尾。目前這
id
是我的第一列,我沒有任何問題,但我正試圖走到最後,因為我遇到了數據問題,但出現以下錯誤:Operation failed: Executing: ALTER TABLE `sedb`.`volume_pricing_agreement` CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT AFTER `ActiveFlag`, DROP PRIMARY KEY, ADD PRIMARY KEY (`AgreementNumber`,`CustomerSiteID`, `CFProgramLevelID`, `Source`, `AgreementTypeID`, `id`); ERROR 1075: Incorrect table definition; there can be only one auto column and it must be defined as a key
我不知道該列是否必須是表定義中的第一個,以及是否無論如何讓它在我想要的任何地方,或者解決方案可能是通過跳過該
id
列來導入數據(假設它是第一個)。我在這裡檢查語法,但我不知道如何在載入期間跳過列:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [PARTITION (partition_name,...)] [CHARACTER SET charset_name] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number {LINES | ROWS}] [(col_name_or_user_var,...)] [SET col_name = expr,...]
這是命令的輸出
SHOW CREATE TABLE sedb.volume_pricing_agreement;
:volume_pricing_agreement, CREATE TABLE `volume_pricing_agreement` ( `id` int(11) NOT NULL AUTO_INCREMENT, `AgreementNumber` int(11) DEFAULT NULL, `AgreementName` varchar(60) CHARACTER SET utf8 DEFAULT NULL, `CustomerSiteID` int(11) NOT NULL, `CFProgramLevelID` int(11) DEFAULT NULL, `Discount` decimal(5,4) NOT NULL DEFAULT '0.0000', `Source` varchar(45) COLLATE utf8_unicode_ci NOT NULL, `ActiveFlag` int(1) NOT NULL, `AgreementTypeID` int(1) NOT NULL DEFAULT '0', `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), KEY `AgreementNumber` (`AgreementNumber`), KEY `CustomerSiteID` (`CustomerSiteID`), KEY `ActiveFlag` (`ActiveFlag`) ) ENGINE=InnoDB AUTO_INCREMENT=2763 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
有什麼幫助嗎?我應該如何處理?
不。表定義中的列順序無關緊要,只有一個舊的例外。在舊版本中,“第一”
TIMESTAMP
列有一個特殊的預設DEFAULT
值。不需要有
AUTO_INCREMENT
. 但是,(基本上)要求您有一個PRIMARY KEY
. 聞起來AgreementNumber
會是這樣嗎?請記住,PK 必須是UNIQUE
(MySQL 要求)。作為旁注,A_I 不一定是 PK。唯一的要求是它是某個索引中的第一列。請記住,PK 是唯一的密鑰是密鑰。
但是,這不是你的“真正”問題。也就是說,您需要在
LOAD DATA
沒有id
提供的情況下進行。計劃 A:載入到另一個表中,然後將其複製過來。複製數據時,指定除id以外的所有列;A_我會處理剩下的。
計劃 B:使用,但指定除 之外
LOAD DATA
的所有列。再次將負責正確預設它。id``A_I
其他提示,當我讓你線上時:
int(1)
是一個 4 字節的數字;這(1)
意味著什麼。也許你想要一個 1-byteTINYINT
?INT UNSIGNED
在適當的地方使用- 使用小於
INT
適當的數據類型;查找MEDIUMINT
,並MEDIUMINT UNSIGNED
在適當的情況下再次進行。- 適當時使用
NOT NULL
。- 不要索引標誌;他們不會被使用。
- 了解“複合”索引。
更多的
如果您選擇使用
UNIQUE
包含 some 的 6 列鍵,VARCHARs
則使用 A_I 可能比使用 PK 更好。A
UNIQUE KEY
是兩件事:索引和唯一性約束。您可以將其用於其中一個或兩者。PK 是
UNIQUE KEY
標識行的。它還與數據“聚集”在一起,使得查找比使用“輔助鍵”(任何非 PK)更有效。當索引列的“基數”非常低時,例如對於標誌,優化器將動態查看您提供的值,並查看是否少於 20% 的表具有該值。在這種情況下,它將使用索引;否則它不會。“20%”隨月相而變化。避開索引的原因是使用索引涉及通過 PK 在索引的 BTree 和數據的 BTree 之間來回彈跳。這可能比簡單地掃描數據要慢,折騰 80% 的行。輔助鍵是包含索引列和 PK 副本的 BTree。