MySQL表添加AUTO_INCREMENT列或者把現有的表字段設置爲AUTO_INCREMENT

       良好的MySQL表設計,需要有一個自增字段(一般命名爲id),在表設計之初,添加上就好,但是對現存的不規範的表進行改造,該如何做呢?

  • 1、表不存在PRIMARY KEY字段,新增一個AUTO_INCREMENT字段

初始表結構如下:

CREATE TABLE `table_a` (
  `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址'
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='代理商信息';

這個表沒有自增字段,需要這個這個表新增一個AUTO_INCREMENT字段:

alter table table_a add column `agent_id` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '代理商id' first;
-- 新增AUTO_INCREMENT字段,字段名爲agent_id(一般命名爲id,這裏只是演示一下別樣的命名)
-- AUTO_INCREMENT必須是整數類型數據列
-- first表示新增的字段放在第一位
-- 自增字段必須是唯一的,所以設置爲PRIMARY KEY

執行上面那條DDL語句之後:

CREATE TABLE `table_a` (
  `agent_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '代理商id',
  `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址',
  PRIMARY KEY (`agent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代理商信息'

這個時候,table_a表就有自增字段了。


  • 2、表已經存在PRIMARY KEY字段,新增一個AUTO_INCREMENT字段

這種情況稍微複雜點,需要:

1.刪除primary key字段

2.新增自增字段

初始表結構如下:

CREATE TABLE `table_a` (
  `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代理商信息'

如果我們直接執行以下DDL腳本,給表添加自增字段:

alter table table_a add column `agent_id` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '代理商id' first;

執行之後會報錯:
SQL 錯誤 [1068] [42000]: Multiple primary key defined
  Multiple primary key defined
  Multiple primary key defined
失敗原因:一個表最多只能有一個primary key。

正確的做法:

-- 先刪除表中的primary key
alter table table_a drop primary key;

此時表的結構如下:

CREATE TABLE `table_a` (
  `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代理商信息'

刪除primary key之後,就可以執行添加自增字段腳本:

alter table table_a add column `agent_id` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '代理商id' first;

此時表的結構如下:

CREATE TABLE `table_a` (
  `agent_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '代理商id',
  `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址',
  PRIMARY KEY (`agent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代理商信息'

  • 3、表已經存在PRIMARY KEY字段,PRIMARY KEY字段設置爲AUTO_INCREMENT字段

前提:現有的primary key字段類型必須是整數類型

初始表結構如下:

CREATE TABLE `table_a` (
  `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代理商信息'

 

  • 3.1 表table_a數據爲空

現在,把table_a的字段user_id設置成自增類型:

alter table table_a modify column `user_id` bigint(20) NOT NUll DEFAULT 0 AUTO_INCREMENT COMMENT '商戶後臺管理員ID,對應sys_user表的user_id';

執行之後報錯:

SQL 錯誤 [1067] [42000]: Invalid default value for 'user_id'
  Invalid default value for 'user_id'
  Invalid default value for 'user_id'

失敗原因:AUTO_INCREMENT字段不能有默認值。

取消默認值:

alter table table_a modify column `user_id` bigint(20) NOT NUll AUTO_INCREMENT COMMENT '商戶後臺管理員ID,對應sys_user表的user_id';

執行成功,此時表的結構如下:

CREATE TABLE `table_a` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代理商信息'

  • 3.2 表table_a數據不爲空,且user_id列有負數值

還是以table_a初始表結構做測試,table_a表初始數據爲:

把table_a的字段user_id設置成自增類型:

alter table table_a modify column `user_id` bigint(20) NOT NUll AUTO_INCREMENT COMMENT '商戶後臺管理員ID,對應sys_user表的user_id';

執行成功,此時表的結構如下:

CREATE TABLE `table_a` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商戶後臺管理員ID,對應sys_user表的user_id',
  `agent_name` varchar(100) NOT NULL DEFAULT '' COMMENT '代理商名稱',
  `contact_mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '聯繫人手機號',
  `contact_address` varchar(100) NOT NULL DEFAULT '' COMMENT '聯繫人地址',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='代理商信息'

所以,網上有人說AUTO_INCREMENT字段需要設置爲UNSIGNED無符號數字類型,這是不對的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章