Mysql

MySQL - 無法將主鍵轉換為自動增量

  • August 19, 2015

我有一個 MySQL 表,其中軟體將主鍵(int)設置為等於主表的主鍵(自動遞增)。由於設計的變化,我現在需要該欄位自動遞增。當我嘗試 ALTER TABLE 時,它返回以下內容:-

ERROR 1062: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'
SQL Statement:
ALTER TABLE `Clinic`.`ClientSupplementary` CHANGE COLUMN `idClientSupplementary` `idClientSupplementary` INT(11) NOT NULL AUTO_INCREMENT

ERROR: Error when running failback script. Details follow.

ERROR 1050: Table 'ClientSupplementary' already exists

這讓我完全感到困惑,因為 ‘1’ 絕對是獨一無二的,就像所有其他主鍵值一樣。我應該在哪裡尋找?

你的文章讓我很感興趣。這裡有一個“解決方法” ,但我很好奇,所以我進行了以下測試。在嘗試解決方法之前,您可能想嘗試下面對我有用的方法。如果存在FOREIGN KEYs 和潛在衝突(重複和/或 KEY 違規),那麼這將不起作用。這可能是您錯誤的原因。

我創建了一個表格(賬單),如下所示。

mysql> CREATE TABLE bill(fred INT, paul VARCHAR(10));
Query OK, 0 rows affected (0.31 sec)

然後插入一些樣本值。

mysql> INSERT INTO bill VALUES(1, 'adsfd');
   Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO bill VALUES(2, 'adsfd');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO bill VALUES(3, 'xxxx');
Query OK, 1 row affected (0.05 sec)

然後我執行了一個SHOW CREATE TABLE My_Table\G\G給出可以剪切和粘貼的清晰輸出)。

mysql> SHOW CREATE TABLE bill\G
*************************** 1. row ***************************
      Table: bill
Create Table: CREATE TABLE `bill` (
 `fred` int(11) DEFAULT NULL,
 `paul` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

只是為了看看我INSERT的s的結果

mysql> SELECT * FROM bill;
+------+-------+
| fred | paul  |
+------+-------+
|    1 | adsfd |
|    2 | adsfd |
|    3 | xxxx  |
+------+-------+
3 rows in set (0.00 sec)
mysql> 

現在,發表你的ALTER TABLE聲明。

ALTER TABLE bill MODIFY COLUMN fred INT AUTO_INCREMENT NOT NULL PRIMARY KEY;

重新檢查表的定義。

mysql> SHOW CREATE TABLE bill\G
*************************** 1. row ***************************
      Table: bill
Create Table: CREATE TABLE `bill` (
 `fred` int(11) NOT NULL AUTO_INCREMENT,
 `paul` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`fred`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

該領域fred現在確實是 aPRIMARY KEY也是一個AUTO_INCREMENT.

並檢查它是否正常工作。

mysql> INSERT INTO bill (paul) VALUES('yyyy');
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM bill;
+------+-------+
| fred | paul  |
+------+-------+
|    1 | adsfd |
|    2 | adsfd |
|    3 | xxxx  |
|    4 | yyyy  |
+------+-------+
4 rows in set (0.00 sec)

所以,它也是AUTO_INCREMENT正確的。我不知道為什麼你原來的陳述給出了奇怪的ALTER TABLE causes auto_increment resequencing錯誤——也許是某種錯誤?在執行這些測試時,我犯了一些小錯誤——MySQL 似乎對步驟的確切順序和語句的特定語法非常挑剔ALTER TABLE

假設您沒有參考fred其他地方,這可能是“安全”的方式:

ALTER TABLE bill
   DROP COLUMN fred,
   ADD  COLUMN fred INT AUTO_INCREMENT NOT NULL PRIMARY KEY;

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