首页 > 解决方案 > 如何在没有主键的mysql表中添加主键

问题描述

我需要使用现有数据向 Mysql 中的表添加主键。

状态:

| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| country_code | varchar(2)   | YES  |     | NULL    |       |
| state_code   | varchar(20)  | YES  |     | NULL    |       |
| state_name   | varchar(255) | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+

我创建了一个 States2 表,它是空的,其中包含一个主键。

+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   | PRI | NULL    |       |
| country_code | varchar(2)   | YES  |     | NULL    |       |
| state_code   | varchar(20)  | YES  |     | NULL    |       |
| state_name   | varchar(255) | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+

我现在要做的是从 States 中获取数据并将其复制到 States2,同时添加 Autoincrement 主键。

这是我尝试过的:

mysql> insert into states2 select NULL,states.* FROM states;
ERROR 1048 (23000): Column 'id' cannot be null

复制这个并同时插入密钥的正确方法是什么?

标签: mysqlsqlselectsql-insert

解决方案


您明确地null 为主键列分配了一个值,这是 MySQL 不允许的(主键不能是null)。

只需将主键列从insert语句中分离出来,这样就可以发生自动增量:

insert into states2 (country_code, state_code, state_name) 
select country_code, state_code, state_name FROM states;

推荐阅读