迁移主键以使用AUTO_Increment

时间:2013-01-07 17:23:55

标签: mysql

我有一张表,主键是sale_id,payment_type

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。原因是我想单独跟踪相同类型的付款。是否可以在不丢失数据的情况下执行此操作?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只需保留您的sale_id,payment_type密钥,但不要保留为主密钥,然后添加id INT NOT NULL AUTO_INCREMENT并将其设为主键:不丢失信息和新主键。

答案 2 :(得分: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 );

答案 3 :(得分: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)