2013-01-07 114 views
2

我在主鍵sale_id表,payment_type遷移主鍵使用AUTO_INCREMENT

mysql> describe phppos_sales_payments; 
+----------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+----------------+---------------+------+-----+---------+-------+ 
| sale_id  | int(10)  | NO | PRI | NULL |  | 
| payment_type | varchar(255) | NO | PRI | NULL |  | 
| payment_amount | decimal(15,2) | NO |  | NULL |  | 
+----------------+---------------+------+-----+---------+-------+ 

我想添加一個新的領域id這是一個自動遞增。原因是我想單獨跟蹤同一類型的付款。是否有可能做到這一點而不會丟失數據?

+0

http://stackoverflow.com/questions/9070764/insert-auto-increment-的重複primary-key-to-existing-mysql-database – ethrbunny

回答

3

這是你可以改變你的表

ALTER TABLE `phppos_sales_payments` 
    -- add a unique index based on the current primary key 
    ADD UNIQUE (`sale_id`,`payment_type`), 
    -- drop the current primary key 
    DROP PRIMARY KEY, 
    -- add the new identity column with autoincrement 
    ADD COLUMN `id` int(10) NOT NULL AUTO_INCREMENT FIRST, 
    -- set primary key to the new identity column 
    ADD PRIMARY KEY (`id`); 

的「神奇」之處添加一個唯一索引,因爲外鍵必須有索引,並在第二位的添加新的標識列自動增量,並一次性爲該列設置主鍵。

SQL Fiddle DEMO

+0

FIRST在AUTO_INCREMENT中表示什麼? –

+0

@ChrisMuench新專欄將排在您的表格專欄的第一位。正常將在最後。這只是在頂部PK塔 - >化妝品:o) –

+0

明白了!謝謝! –

1

只要保留您的sale_id,payment_type鍵,但不是主要的,然後添加id INT NOT NULL AUTO_INCREMENT並將其作爲主鍵:不會丟失信息和新的主鍵。

0
ALTER TABLE `table` DROP PRIMARY KEY, 

ALTER TABLE `table` ADD `id` INT(11) NOT NULL AUTO_INCREMENT FIRST 
ALTER TABLE `table` ADD PRIMARY KEY (id) 
+0

我試圖刪除主鍵,但我得到了#1025 - 將'./pos/#sql-299_17'重命名爲'./pos/phppos_sales_payments'(errno :150) 這是因爲sale_id是引用另一個表的外鍵(FOREIGN KEY('sale_id')REFERENCES'phppos_sales'('sal e_id'))。 有沒有辦法解決這個問題? –

1

你需要執行一個ALTER TABLE語句來實現這一目標:

ALTER TABLE `table` DROP PRIMARY KEY, 
ADD COLUMN id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST, 
ADD UNIQUE sale_id_payment_type(sale_id, payment_type);