修改表指的是修改数据库中已经存在的数据表的结构。MySQL 使用 ALTER TABLE 语句修改表。常用的修改表的操作有修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。

1.基本语法

  1. ALTER TABLE <表名> [修改选项]
  2. ADD COLUMN <列名> <类型>
  3. MODIFY COLUMN <列名> <类型>
  4. CHANGE COLUMN <旧列名> <新列名> <新列类型>
  5. ENAME TO <新表名>
  6. DROP COLUMN <列名>
  7. ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
  8. 举例表:
  9. +--------+-------------+------+-----+---------+-------+
  10. | Field | Type | Null | Key | Default | Extra |
  11. +--------+-------------+------+-----+---------+-------+
  12. | id | int(11) | YES | | NULL | |
  13. | name | varchar(25) | YES | | NULL | |
  14. | deptId | int(11) | YES | | NULL | |
  15. | salary | float | YES | | NULL | |
  16. +--------+-------------+------+-----+---------+-------+

2.添加字段

  1. ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在的字段名];
  2. -- FIRST AFTER 已存在的字段名”用于指定新增字段在表中的位置,如果 SQL 语句中没有这两个参数,则
  3. -- 默认将新添加的字段设置为数据表的最后列。

【实例 1】使用 ALTER TABLE 修改表 tb_emp1 的结构,在表的第一列添加一个 int 类型的字段 col1,输入的 SQL 语句和运行结果如下所示。

  1. ALTER TABLE tb_emp1 ADD COLUMN col1 INT FIRST;
  2. --输出:
  3. +--------+-------------+------+-----+---------+-------+
  4. | Field | Type | Null | Key | Default | Extra |
  5. +--------+-------------+------+-----+---------+-------+
  6. | col1 | int(11) | YES | | NULL | |
  7. | id | int(11) | YES | | NULL | |
  8. | name | varchar(25) | YES | | NULL | |
  9. | deptId | int(11) | YES | | NULL | |
  10. | salary | float | YES | | NULL | |
  11. +--------+-------------+------+-----+---------+-------+

【实例 2】使用 ALTER TABLE 修改表 tb_emp1 的结构,在一列 name 后添加一个 int 类型的字段 col2,输入的 SQL 语句和运行结果如下所示。

  1. ALTER TABLE tb_emp1 ADD COLUMN col2 INT AFTER name;
  2. -- 输出:
  3. +--------+-------------+------+-----+---------+-------+
  4. | Field | Type | Null | Key | Default | Extra |
  5. +--------+-------------+------+-----+---------+-------+
  6. | col1 | int(11) | YES | | NULL | |
  7. | id | int(11) | YES | | NULL | |
  8. | name | varchar(25) | YES | | NULL | |
  9. | col2 | int(11) | YES | | NULL | |
  10. | deptId | int(11) | YES | | NULL | |
  11. | salary | float | YES | | NULL | |
  12. +--------+-------------+------+-----+---------+-------+
  1. -- 增加列为主键
  2. alter table patient add column id BIGINT not null PRIMARY KEY auto_increment first
  3. -- 将已有的列设置为主键
  4. -- 将列名为id的字段设置为主键
  5. alter table patient add primary key(id)

3.修改数据类型

  1. ALTER TABLE <表名> MODIFY <字段名> <数据类型>
  2. -- 表名指要修改数据类型的字段所在表的名称,字段名指需要修改的字段,数据类型指修改后字段的新数据类型。

【实例 3】使用 ALTER TABLE 修改表 tb_emp1 的结构,将 name 字段的数据类型由 VARCHAR(22) 修改成 VARCHAR(30),输入的 SQL 语句和运行结果如下所示。

  1. ALTER TABLE tb_emp1 MODIFY name VARCHAR(30);
  2. -- 输出:
  3. +--------+-------------+------+-----+---------+-------+
  4. | Field | Type | Null | Key | Default | Extra |
  5. +--------+-------------+------+-----+---------+-------+
  6. | col1 | int(11) | YES | | NULL | |
  7. | id | int(11) | YES | | NULL | |
  8. | name | varchar(30) | YES | | NULL | |
  9. | col2 | int(11) | YES | | NULL | |
  10. | deptId | int(11) | YES | | NULL | |
  11. | salary | float | YES | | NULL | |
  12. +--------+-------------+------+-----+---------+-------+

4.修改表名

  1. ALTER TABLE <旧表名> RENAME [TO] <新表名>;
  2. -- TO 为可选参数,使用与否均不影响结果。

【实例 6】使用 ALTER TABLE 将数据表 tb_emp1 改名为 tb_emp2,输入的 SQL 语句和运行结果如下所示。

  1. ALTER TABLE tb_emp1 RENAME TO tb_emp2;
  2. +--------------------+
  3. | Tables_in_test_db |
  4. +--------------------+
  5. | tb_emp2 |
  6. +--------------------+

5.修改字段名称

  1. ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
  2. --旧字段名:指修改前的字段名;新字段名:指修改后的字段名;
  3. -- 新数据类型:指修改后的数据类型,如果不需要修改字段的数据类型,可以将新数据类型设置成与原来一样, 但数据类型不能为空。

【实例 5】使用 ALTER TABLE 修改表 tb_emp1 的结构,将 col1 字段名称改为 col3,同时将数据类型变为 CHAR(30),输入的 SQL 语句和运行结果如下所示。

  1. ALTER TABLE tb_emp1 CHANGE col1 col3 CHAR(30);
  2. -- 输出:
  3. +--------+-------------+------+-----+---------+-------+
  4. | Field | Type | Null | Key | Default | Extra |
  5. +--------+-------------+------+-----+---------+-------+
  6. | col3 | char(30) | YES | | NULL | |
  7. | id | int(11) | YES | | NULL | |
  8. | name | varchar(30) | YES | | NULL | |
  9. | deptId | int(11) | YES | | NULL | |
  10. | salary | float | YES | | NULL | |
  11. +--------+-------------+------+-----+---------+-------+

6.创建修改约束

  1. create table table_name(
  2. 列名1 数据类型 (int) primary key auto_increment,
  3. 列名2 数据类型 not null,
  4. 列名3 数据类型 unique,
  5. 列名4 数据类型 default '值',
  6. constraint 索引名 foreign key(外键列) references 主键表(主键列)
  7. on delete cascade | on delete set null
  8. )
  1. 1.主键约束
  2. 添加:alter table table_name add primary key (字段)
  3. 删除:alter table table_name drop primary key
  4. 2.非空约束
  5. 添加:alter table table_name modify 列名 数据类型 not null
  6. 删除:alter table table_name modify 列名 数据类型 null
  7. 3.唯一约束
  8. 添加:alter table table_name add unique 约束名(字段)
  9. 删除:alter table table_name drop key 约束名
  10. 4.自动增长
  11. 添加:alter table table_name modify 列名 int auto_increment
  12. 删除:alter table table_name modify 列名 int
  13. 5.外键约束
  14. 添加:alter table table_name add constraint 约束名 foreign key(外键列)
  15. references 主键表(主键列)
  16. 6.默认值
  17. 添加:alter table table_name alter 列名 set default '值'
  18. 删除:alter table table_name alter 列名 drop default

7.删除字段

  1. ALTER TABLE <表名> DROP <字段名>;
  2. -- 其中,字段名指需要从表中删除的字段的名称。

【实例 4】使用 ALTER TABLE 修改表 tb_emp1 的结构,删除 col2 字段,输入的 SQL 语句和运行结果如下所示。

  1. ALTER TABLE tb_emp1 DROP col2;
  2. -- 输出:
  3. +--------+-------------+------+-----+---------+-------+
  4. | Field | Type | Null | Key | Default | Extra |
  5. +--------+-------------+------+-----+---------+-------+
  6. | col1 | int(11) | YES | | NULL | |
  7. | id | int(11) | YES | | NULL | |
  8. | name | varchar(30) | YES | | NULL | |
  9. | deptId | int(11) | YES | | NULL | |
  10. | salary | float | YES | | NULL | |
  11. +--------+-------------+------+-----+---------+-------+

8.默认值

  1. Field Type Null Key Default Extra
  2. ------------- ----------- ------ ------ ------- --------
  3. runoob_id int(10) YES (NULL)
  4. runoob_title varchar(20) YES (NULL)
  5. runoob_author varchar(20) YES (NULL)
  1. 1、修改字段默认值
  2. alter table patient alter address set default 2
  3. 输出:
  4. Field Type Null Key Default Extra
  5. ------------- ----------- ------ ------ ------- --------
  6. runoob_id int(10) YES 3
  7. runoob_title varchar(20) YES (NULL)
  8. runoob_author varchar(20) YES (NULL)
  9. 2、删除字段默认值
  10. alter table patient alter address drop default
  11. 输出:
  12. Field Type Null Key Default Extra
  13. ------------- ----------- ------ ------ ------- --------
  14. runoob_id int(10) YES (NULL)
  15. runoob_title varchar(20) YES (NULL)
  16. runoob_author varchar(20) YES (NULL)
  17. 3、增加新列,带默认值,在第一列
  18. ALTER TABLE `runoob` ADD COLUMN backup1 VARCHAR(3) DEFAULT 6 FIRST
  19. 输出:
  20. Field Type Null Key Default Extra
  21. ------------- ----------- ------ ------ ------- --------
  22. backup1 varchar(3) YES 6
  23. runoob_id int(10) YES (NULL)
  24. runoob_title varchar(20) YES (NULL)
  25. runoob_author varchar(20) YES (NULL)
  26. 4、查看表所有字段默认值
  27. show COLUMNS from patient mysql
  28. Field Type Null Key Default Extra
  29. ------------- ----------- ------ ------ ------- --------
  30. backup1 varchar(3) YES 6
  31. runoob_id int(10) YES 3
  32. runoob_title varchar(20) YES (NULL)
  33. runoob_author varchar(20) YES (NULL)