關於主鍵的SQL文法:
alter table t_google_mem drop primary key; //刪除表現有主鍵
alter table t_google_mem add primary key (f_id); //建立主鍵
alter table t_google_mem add primary key (f_id, f_csname); //建立多值主鍵
下面說下我在實際的工作過程中,遇到的一個問題。目前我有了如下的一張表,現在要做的操作是將f_id和f_csname聯合作為多值主鍵。
mysql> desc t_google_mem;+--------------+-----------+------+-----+---------------------+----------------+| Field | Type | Null | Key | Default | Extra |+--------------+-----------+------+-----+---------------------+----------------+| f_id | int(10) | NO | PRI | NULL | auto_increment || f_name | char(255) | NO | | | || f_assion | char(255) | NO | | | || f_csname | char(255) | NO | | | || f_time | datetime | NO | | 0000-00-00 00:00:00 | || f_status | int(10) | NO | | 1 | |+--------------+-----------+------+-----+---------------------+----------------+
錯誤的做法:
按照以前的習慣,我的打算是先刪除掉表的主鍵,然後再添加多值主鍵。但在使用alter table t_google_mem drop primary key;語句時,出錯了提示如下:
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
錯誤的大概意思是:不正確的表格定義;這裡只能有一個欄位當作auto increment,並且必須把這個欄位作為主鍵。
思考上面的錯誤提示後,我覺得正確的步驟應該首先去掉表中欄位f_id的auto_increment的屬性,然後再刪除主鍵,下一步再添加多值主鍵,最後再將f_id調整成auto_increment。
說做就做,下面開始實施SQL修改。
第一步:alter table t_google_mem modify f_id int(10) not null default 0;
mysql> alter table t_google_mem modify f_id int(10) not null default 0;Query OK, 41 rows affected (0.05 sec)Records: 41 Duplicates: 0 Warnings: 0
第二步:alter table t_google_mem drop primary key;
mysql> alter table t_google_mem drop primary key;Query OK, 41 rows affected (0.04 sec)Records: 41 Duplicates: 0 Warnings: 0
第三步:alter table t_google_mem add primary key (f_id, f_csname);
mysql> alter table t_google_mem add primary key (f_id, f_csname);Query OK, 41 rows affected (0.03 sec)Records: 41 Duplicates: 0 Warnings: 0
第四步:alter table t_google_mem modify f_id int(10) not null auto_increment;
mysql> alter table t_google_mem modify f_id int(10) not null auto_increment;Query OK, 41 rows affected (0.02 sec)Records: 41 Duplicates: 0 Warnings: 0
經過上述4步的修改後,檢查表結構,結果顯示已經滿足我的要求。
mysql> desc t_google_mem;+--------------+-----------+------+-----+---------------------+----------------+| Field | Type | Null | Key | Default | Extra |+--------------+-----------+------+-----+---------------------+----------------+| f_id | int(10) | NO | PRI | NULL | auto_increment || f_name | char(255) | NO | | | || f_assion | char(255) | NO | | | || f_csname | char(255) | NO | PRI | | || f_time | datetime | NO | | 0000-00-00 00:00:00 | || f_status | int(10) | NO | | 1 | |+--------------+-----------+------+-----+---------------------+----------------+