良好的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無符號數字類型,這是不對的。