Mysql

配置為 PK、NN 和 AI 的 ID 列是否是我的表定義的第一列?

  • May 1, 2017

我有一個.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-byte TINYINT
  • INT UNSIGNED在適當的地方使用
  • 使用小於INT適當的數據類型;查找MEDIUMINT,並MEDIUMINT UNSIGNED在適當的情況下再次進行。
  • 適當時使用NOT NULL
  • 不要索引標誌;他們不會被使用。
  • 了解“複合”索引。

更多的

如果您選擇使用UNIQUE包含 some 的 6 列鍵,VARCHARs則使用 A_I 可能比使用 PK 更好。

AUNIQUE KEY是兩件事:索引和唯一性約束。您可以將其用於其中一個或兩者。

PK 是UNIQUE KEY標識行的。它還與數據“聚集”在一起,使得查找比使用“輔助鍵”(任何非 PK)更有效。

當索引列的“基數”非常低時,例如對於標誌,優化器將動態查看您提供的值,並查看是否少於 20% 的表具有該值。在這種情況下,它將使用索引;否則它不會。“20%”隨月相而變化。避開索引的原因是使用索引涉及通過 PK 在索引的 BTree 和數據的 BTree 之間來回彈跳。這可能比簡單地掃描數據要慢,折騰 80% 的行。輔助鍵是包含索引列和 PK 副本的 BTree。

引用自:https://dba.stackexchange.com/questions/172436