MySQL修改已有表的结构、更改主键

本文介绍了如何使用SQL命令在MySQL中修改已有表的结构,包括添加新字段、删除字段以及更改主键。在更改主键时,如果字段存在重复值,会导致错误1062。解决方案包括手动更新字段值或重新创建表。

MySQL修改已有表的结构、更改主键

因为业务需要,我要对已有的表做两种修改:①添加新的字段;②更改主键。

一、添加新的字段

ALTER TABLE 表名 ADD COLUMN 待增加的列名 待增加的列的数据类型 待增加的列的其他属性;

如:

ALTER TABLE user ADD COLUMN uuid varchar(20) NOT NULL;
ALTER TABLE user ADD COLUMN openid varchar(32);

二、删除已有字段

ALTER TABLE 表名 DROP COLUMN 待删除的列名;

如:

ALTER TABLE user DROP COLUMN uuid;

三、更改主键

1、去除旧主键(保留该字段)

ALTER TABLE 表名 DROP PRIMARY KEY;

如:

ALTER TABLE user DROP PRIMARY KEY;

2、设置新主键

ALTER TABLE 表名 ADD PRIMARY KEY(要设置为主键的列名);

如:

ALTER TABLE user ADD PRIMARY KEY(uuid);
设置新主键过程遇到的报错

这种做法对于一个还没有数据的表来说可以成功,但是对于已有数据的表而言,会提示错误:ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY'。原因是当前这个字段在所有的数据中的值都为‘’(一个空的字符串),即所有数据中这个字段的值是相同的,但设置这个字段为主键时要求这个字段的值不能重复。

解决方法一:为表中每条数据的这个字段设置不同的值(如果数据不多,这个步骤可以手动完成),然后再设置这个字段为主键。

解决方法二:保存这个表的数据信息(转储成sql文件),然后删除这个表,按照新的结构重新创建表并导入数据。

补充:为字段设置值

UPDATE TABLE 表名 SET 待修改的字段=设置的值;

如:

UPDATE TABLE user SET uuid=1;

参考

MySQL修改表结构

MySQL如何修改主键

<think>我们参考之前的引用资料,用户想要在已有MySQL中添加主键。根据引用[1]和引用[2],我们可以使用ALTERTABLE语句来添加主键。步骤:1.确定要设为主键的列(可以是单列或多列组合)。2.确保该列(或列组合)的值是非空的(NOTNULL)且唯一的(UNIQUE),否则无法设置为主键。3.使用ALTERTABLE语句添加主键约束。注意点:-如果已有数据,需要先确保所选列没有重复值和空值,否则添加主键会失败。-引用[3]中提到,可以先删除已有主键(如果有的话),然后再添加新的主键。但一个只能有一个主键,所以在添加新主键前需要先删除旧主键(如果存在)。具体步骤(示例):假设有一个`my_table`,我们想要将`id`列设为主键。1.确保`id`列是非空且唯一的:-如果`id`列允许为NULL,则需要先修改该列为NOTNULL:```sqlALTERTABLEmy_tableMODIFYidINTNOTNULL;```-如果`id`列有重复值,则需要先处理重复值(例如通过删除重复行或更新重复值)。2.添加主键:```sqlALTERTABLEmy_tableADDPRIMARYKEY(id);```如果是多列组合主键,则:```sqlALTERTABLEmy_tableADDPRIMARYKEY(col1,col2);```如果中已经有主键,我们需要先删除旧主键,再添加新主键。删除主键的语法是:```sqlALTERTABLEmy_tableDROPPRIMARYKEY;```注意:删除主键之前,如果该主键列是自增的,需要先取消自增(如果有必要),因为自增属性依赖于主键。引用[4]中提到了在添加主键的同时更新现有行,比如添加一个自增主键列。我们可以这样做:```sql--先添加一个整数列,不能直接设为主键(因为现有行需要填充)ALTERTABLEmy_tableADDCOLUMNnew_idINTNOTNULL;--然后更新这个列,给它赋唯一的值(例如通过变量自增)SET@count=0;UPDATEmy_tableSETnew_id=@count:=@count+1;--最后将该列设为主键ALTERTABLEmy_tableADDPRIMARYKEY(new_id);```或者,如果希望新列是自增主键,可以在添加列时指定自增属性,然后再设为主键:```sqlALTERTABLEmy_tableADDCOLUMNnew_idINTNOTNULLAUTO_INCREMENTFIRST,ADDPRIMARYKEY(new_id);```但是注意,在添加自增列时,MySQL会自动为其生成连续的唯一值,所以不需要手动更新。另外,引用[5]提到了在线添加主键(在MySQL5.6及更高版本中支持,但具体操作可能有所不同),这适用于大以避免长时间锁。但基本语法相同。总结操作:根据用户需求,如果只是为已有的列添加主键,直接使用ALTERTABLE...ADDPRIMARYKEY即可。但需要确保列满足条件(非空、唯一)。完整示例(将`user_id`列设为主键):步骤1:检查并修改列非空```sqlALTERTABLEusersMODIFYuser_idINTNOTNULL;```步骤2:确保唯一性(如果已有数据,可能需要先处理重复值)步骤3:添加主键```sqlALTERTABLEusersADDPRIMARYKEY(user_id);```如果用户想要添加一个自增主键列(中原来没有主键):```sql--添加一个自增列ALTERTABLEusersADDCOLUMNidINTNOTNULLAUTO_INCREMENTFIRST,ADDPRIMARYKEY(id);```注意:如果已经有数据,添加自增列后,新列会自动填充唯一的序列号(从1开始)。</think> 在 MySQL 中为现有添加主键需要遵循特定流程和注意事项。以下是完整的操作指南,基于您提供的引用资料整理: ### 为已有添加主键的操作步骤 1. **检查结构和数据状态** ```sql -- 查看结构 DESC your_table_name; -- 检查目标列是否包含空值或重复值 SELECT COUNT(*) FROM your_table_name WHERE your_column IS NULL; SELECT COUNT(DISTINCT your_column) FROM your_table_name; ``` 2. **处理必要前提条件** - **非空约束**:确保目标列没有 NULL 值 ```sql ALTER TABLE your_table_name MODIFY your_column data_type NOT NULL; ``` - **消除重复值**(如有必要) ```sql -- 临时备份重复数据 CREATE TABLE dup_records AS SELECT * FROM your_table_name WHERE your_column IN ( SELECT your_column FROM your_table_name GROUP BY your_column HAVING COUNT(*) > 1 ); -- 删除重复数据 DELETE t1 FROM your_table_name t1 INNER JOIN your_table_name t2 WHERE t1.id < t2.id AND t1.your_column = t2.your_column; ``` 3. **添加主键约束(两种方式)** **方式一:直接添加主键** ```sql -- 单列主键 ALTER TABLE your_table_name ADD PRIMARY KEY (your_column); [^1][^2] -- 复合主键 ALTER TABLE your_table_name ADD PRIMARY KEY (col1, col2); [^3] ``` **方式二:通过新列添加自增主键** ```sql -- 添加自增列 ALTER TABLE your_table_name ADD COLUMN id INT AUTO_INCREMENT FIRST; [^4] -- 填充自增值 SET @row_number = 0; UPDATE your_table_name SET id = (@row_number := @row_number + 1); -- 设置为主键 ALTER TABLE your_table_name ADD PRIMARY KEY (id); [^1][^2] ``` ### 关键注意事项 1. **数据类型优化**: - 整型主键优先使用 `INT` 或 `BIGINT` - 避免在 `VARCHAR` 上创建主键(除非必要) - 确保字段长度合理(例如:`VARCHAR(50)` 优于 `VARCHAR(255)`) 2. **性能考虑**: - 大操作建议在低峰时段执行 - 先创建索引再添加约束可减少锁时间 ```sql CREATE INDEX idx_temp ON your_table_name(your_column); ALTER TABLE your_table_name ADD PRIMARY KEY (your_column); [^5] ``` 3. **特殊情况处理**: ```sql -- 删除已有主键 ALTER TABLE your_table_name DROP PRIMARY KEY; [^3] -- 在线修改MySQL 5.6+) ALTER TABLE your_table_name ADD PRIMARY KEY (your_column), ALGORITHM=INPLACE, LOCK=NONE; [^5] ``` ### 完整操作示例 ```sql -- 场景:为 users 添加基于 email 的主键 ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL; -- 删除可能存在的重复邮箱 WITH duplicates AS ( SELECT email, MIN(id) AS keep_id FROM users GROUP BY email HAVING COUNT(*) > 1 ) DELETE FROM users WHERE email IN (SELECT email FROM duplicates) AND id NOT IN (SELECT keep_id FROM duplicates); -- 添加主键约束 ALTER TABLE users ADD PRIMARY KEY (email); -- 验证结果 SHOW CREATE TABLE users; ``` ### 常见问题解决 1. **错误 1062 (Duplicate entry)**:示存在重复值,需先清理数据 2. **错误 1075 (Incorrect table definition)**:通常因自增列不是主键引起 3. **错误 1170 (BLOB/TEXT can't have default value)**:避免在 TEXT/BLOB 类型上建主键
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值