2

我有一个表,其中主键是 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

4 回答 4

4

这就是你可以改变你的桌子的方法

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 小提琴演示

于 2013-01-09T22:39:49.917 回答
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 );
于 2013-01-10T08:03:37.397 回答
1

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

于 2013-01-07T17:29:39.540 回答
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)
于 2013-01-07T17:55:21.903 回答