SQL Alter
1. 定义
维基百科:Alter
指令用于已有数据表的,、和数据表字段都可以通过 Alter 指令来完成。
编程之家解释:Alter 使可以已创建的数据表,但大多数情况下数据表字段和类型需要在定义的时候就确认,虽然 Alter 可以字段的类型和约束,但不能过于依赖;Alter 更多的时候用于索引的和。
2. 前言
本小节,我们将一起学习 Alter
。
我们可以把 Alter 指令理解为一颗后悔药
,很多时候因为业务的变更,通过 Create 创建的数据表不能满足现在的需求,这时便吃上一颗后悔药——数据表结构。
Alter 常用的操作主要有两大类,分别是:字段操作和索引操作。在小节中,我们也将按照这样的顺序来依次学习。
本小节测试数据如下,请先在中执行:
DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user( username varchar(), age int);
3. 字段操作
字段操作由字段、字段和字段三部分组成,它们语法类似,下面我们分别介绍。
Alter 字段的语法如下:
ALTER TABLE [table_name] ADD ([col] [datatype]);
其中table_name
代表待的数据表,col
表示新增字段,datatype
为新增字段类型。
请书写 语句,为imooc_user
表新增字段,字段类型为
float
。
分析:
按照 Alter 字段语法, 字段即可。
语句:
ALTER TABLE imooc_user ADD float;
后,表信息如下:
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(20) | YES | | <null> | | | age | int(11) | YES | | <null> | | | | float | YES | | <null> | | +----------+-------------+------+-----+---------+-------+
Alter 字段语法如下:
ALTER TABLE [table_name] MODIFY(COLUMN [col] [datatype]);
其中table_name
是待数据表,col
是待字段名,datatype
是将要的字段类型。
请书写 语句,上述的imooc_user
表,使username
字段的类型从varchar(20)
变成varchar(30)
。
分析:
按照字段的语法, username 字段类型即可。
语句:
ALTER TABLE imooc_user MODIFY COLUMN username varchar();
如果是在 Postgre 中,语句稍有不同,如下:
ALTER TABLE imooc_user ALTER COLUMN username TYPE varchar();
后表信息如下:
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(30) | YES | | <null> | | | age | int(11) | YES | | <null> | | +----------+-------------+------+-----+---------+-------+
我们也可以通过 ALTER 指令来字段的约束,如为 age 字段上 NOT NULL 和 DEFAULT约束:
ALTER TABLE imooc_user MODIFY COLUMN age int NOT NULL DEFAULT ;
如果使用Postgre,则语句如下:
ALTER TABLE imooc_user ALTER age SET NOT NULL;ALTER TABLE imooc_user ALTER age SET DEFAULT ;
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(30) | YES | | <null> | | | age | int(11) | NO | | 18 | | +----------+-------------+------+-----+---------+-------+
Alter 字段语法如下:
ALTER TABLE [table_name] DROP [col];
其中table_name
是待表的,col
是待字段名。
请书写 语句,imooc_user
表中的age
字段。
分析:
按照语法掉 age 字段即可。
语句:
ALTER TABLE imooc_user DROP age;
成功后,表信息如下:
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(20) | YES | | <null> | | +----------+-------------+------+-----+---------+-------+
4. 索引操作
索引操作由索引和索引两部分组成,如果你不了解索引,我们将会在 索引一节中详细介绍。本小节我们只会介绍索引和 Alter 是如何搭配使用的。
索引的语法如下:
ALTER TABLE [table_name] ADD INDEX [index_name] ([col]);
其中index_name
代表索引,col
表示给那一字段索引。
在 Postgre 中,索引的语法有较大差异,如下:
CREATE INDEX [index_name] ON [table_name]([col]...);
请书写 语句,给imooc_user
表中的age
字段索引。
分析:
按照语法给 age 字段索引即可。
语句:
ALTER TABLE imooc_user ADD INDEX age_index (age);
Postgre 语句如下:
CREATE INDEX age_index ON imooc_user(age);
成功后,表信息如下:
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(20) | YES | | <null> | | | age | int(11) | YES | MUL | <null> | | +----------+-------------+------+-----+---------+-------+
我们可以为多个字段索引,即联合索引
,如下:
ALTER TABLE imooc_user ADD INDEX username_age_index (username, age);
Postgre 语句如下:
CREATE INDEX username_age_index ON imooc_user(username,age);
成功后,表信息如下:
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(20) | YES | MUL | <null> | | | age | int(11) | YES | | <null> | | +----------+-------------+------+-----+---------+-------+
索引的语法如下:
ALTER TABLE [table_name] DROP INDEX [index_name];
其中index_name
代表索引。
Postgre 索引语法如下:
DROP INDEX [index_name];
请书写 语句,imooc_user
表中的username_age_index
索引。
分析:
按照索引语法 username_age_index 索引即可。
语句:
ALTER TABLE imooc_user DROP INDEX username_age_index;
Postgre 语句如下:
DROP INDEX username_age_index;
成功后,表信息如下:
+----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(20) | YES | | <null> | | | age | int(11) | YES | | <null> | | +----------+-------------+------+-----+---------+-------+
5. 个人经验
Alter 指令给了你吃后悔药的权利,但不要过于依赖它,对于数据表字段的设计最好要在新建时就已经确定。
Alter 指令数据表是十分消耗和时,请不要在线上工作时使用它。