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`);

「魔法」は、一意のインデックスを追加することです。外部キーにはインデックスが必要であり、次に自動インクリメントを使用して新しいID列を追加し、その列の主キーを一度に設定する必要があるためです。

SQLフィドルデモ

于 2013-01-09T22:39:49.917 に答える
1

sale_id、payment_typeキーを保持しますが、プライマリとしては保持しません。次に、を追加して、それをid INT NOT NULL AUTO_INCREMENTプライマリキーにします。情報と新しいプライマリキーが失われることはありません。

于 2013-01-07T17:29:39.540 に答える
1

これを実現するには、単一のALTERTABLEステートメントを実行する必要があります。

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 に答える
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 に答える