当前位置:首页 > 问答 > 正文

MySQL里头怎么加字段还有改字段那些事儿,简单讲讲方法和步骤

这事儿其实挺常见的,比如你一开始设计一个用户表,只想了用户名和密码,后来发现还得记录每个人的年龄或者电话号码,这时候就需要加字段了,又或者,你发现电话号码字段设得太短了,有些国际长途存不进去,那就得改字段。

先说说怎么加个新字段

加字段用的是 ALTER TABLE 语句,后面跟着 ADD COLUMN,这个 ALTER TABLE 的意思就是“修改表”,ADD COLUMN 增加列”(在数据库里,字段也叫列)。

最基本的语法长这样: ALTER TABLE 表名字 ADD COLUMN 新字段名字 字段类型;

举个例子,你有个表叫 user,现在想给它加一个 age 字段,用来存年龄,年龄是整数,那么你就可以在MySQL的管理工具(比如命令行或者Navicat那种图形化工具)里这么写: ALTER TABLE user ADD COLUMN age INT;

执行一下,这个字段就加上了,以后新存入的用户数据就可以填年龄了。

但光这样可能还不够,你可能会有些额外要求:

  1. 想指定字段放在哪儿:默认情况下,新字段会加在表的最后面,但你可能想把它放在用户名后面,看得更顺眼,你可以用 AFTER 关键字。 ALTER TABLE user ADD COLUMN age INT AFTER username; 这句话的意思就是,新加的 age 字段,放在已有的 username 字段后面。

  2. 想设置默认值:比如大部分用户都是20岁,你可以给年龄设个默认值20,这样如果不填,数据库自动就给它填上20。 ALTER TABLE user ADD COLUMN age INT DEFAULT 20; 这个 DEFAULT 20 就是设置默认值。

  3. 不允许为空:如果你要求每个用户必须填年龄,不能是空的,那就加上 NOT NULLALTER TABLE user ADD COLUMN age INT NOT NULL DEFAULT 20; 这句话合起来就是:加一个年龄字段,是整数,不允许为空,如果插入数据时没提供值,就默认给20。

再讲讲怎么改已有的字段

改字段稍微复杂点,因为可能涉及改名字、改类型、改约束等等,用的还是 ALTER TABLE 语句,但后面跟的是 CHANGE COLUMN 或者 MODIFY COLUMN

MySQL里头怎么加字段还有改字段那些事儿,简单讲讲方法和步骤

这里有个区别(根据MySQL官方手册的说法):

  • CHANGE COLUMN:如果你想改字段的名字,或者同时改名字和类型/约束,用这个,它比较全能,但需要你把旧名字和新名字都写上。
  • MODIFY COLUMN:如果你不想改字段名,只想改它的类型或者约束(比如把字符串改长点、允许空改成不允许空),用这个更简洁。

举几个例子就明白了:

  1. 修改字段类型(不改名) 比如你当初把电话号码字段 phone 设成了 VARCHAR(20),现在发现不够用,想扩大到30位。 ALTER TABLE user MODIFY COLUMN phone VARCHAR(30); 很简单,直接用 MODIFY COLUMN 指定字段名和新的类型就好了。

  2. 修改字段名(或者同时改名改类型) 比如你觉得 phone 这个名字不好,想改成 telephone,类型保持不变。 ALTER TABLE user CHANGE COLUMN phone telephone VARCHAR(30); 注意,即使你不想改变类型,也需要把原来的类型 VARCHAR(30) 再写一遍,不然会报错。CHANGE 要求你完整地定义新字段。

    如果你想同时把名字从 phone 改成 mobile_phone,并且把类型从 VARCHAR(30) 改成 CHAR(11),也是一条语句搞定: ALTER TABLE user CHANGE COLUMN phone mobile_phone CHAR(11);

  3. 修改字段的默认值 比如你给年龄设置的默认值20不合适了,想改成18。 设置默认值: ALTER TABLE user ALTER COLUMN age SET DEFAULT 18; 删除默认值(让字段没有默认值): ALTER TABLE user ALTER COLUMN age DROP DEFAULT;

    MySQL里头怎么加字段还有改字段那些事儿,简单讲讲方法和步骤

  4. 修改字段是否允许为空 比如你一开始允许电话号码为空,现在业务要求必须填,就要把它改成 NOT NULLALTER TABLE user MODIFY COLUMN telephone VARCHAR(30) NOT NULL; 注意,如果这个字段里已经有NULL空值了,你直接这么改会失败,你得先把这些空值都更新成某个值(比如空字符串),才能执行这个操作。

重要提醒和注意事项

这些操作听起来简单,但对线上正在使用的数据库做的时候,一定要非常小心。

  1. 备份第一:在执行任何 ALTER TABLE 操作之前,只要条件允许,一定要先把整个数据库或者那张表备份一下,万一操作失误或者出了什么岔子,还能恢复回来,这是血泪教训,根据DBA(数据库管理员)们的普遍经验,这是铁律。

  2. 锁表问题:直接使用上面这些语句,尤其是表很大或者服务器比较忙的时候,MySQL可能会锁住整个表(根据MySQL的官方文档,某些操作会导致表锁),导致这段时间内其他读写这个表的请求都要等着,网站或应用可能就会卡顿甚至报错,对于大表,这不是个小问题。

  3. 大数据量的处理:如果你的表已经有几百万甚至上千万条数据了,加个字段或改个字段类型(比如把整数改成字符串)可能会非常慢,因为MySQL需要为每一行数据执行这个变更操作,可能会需要几分钟甚至几小时,这段时间数据库压力会很大。

    对于这种大表,有一些更高级的技巧来减少影响,比如先在一台备用的数据库上操作,然后再切换过来(这属于数据库运维的高级话题了),但作为一般了解,你需要知道有性能影响这回事。

核心就是记住 ALTER TABLE 这个命令,加字段用 ADD,改字段用 CHANGE(要改名时)或 MODIFY(不改名时),操作前务必备份,对重要的大表操作要谨慎选择时间(比如半夜访问量小的时候)。