ALTER TABLE
功能描述
修改表,包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所属模式、添加/更新多个列、打开/关闭行访问控制开关。
本文档只介绍ALTER TABLE语句兼容MySQL的特性,原Vastbase的ALTER TABLE语法未做删除和修改,详见ALTER TABLE。
Vastbase在MySQL兼容模式下,支持ALTER TABLE
如下特性用法:
支持修改具有AUTO_INCREMENT属性的自增字段的下一个值。
支持在使用MODIFY子句修改表的已有字段时使用可选关键字COLUMN。
ALTER TABLE ADD
或者ALTER TABLE MODIFY
语句支持通过FIRST或AFTER关键字指定字段位置。ALTER TABLE ADD
用于向表中增加一个新的字段。ALTER TABLE MODIFY
用于修改已有字段的定义。
注意事项
本文档提及的特性仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
Vastbase仅支持修改普通表和分区表的AUTO_INCREMENT属性,不支持物化视图,复合类型等其他类型的自增属性。
修改语句与插入语句都可能改变下一个自增值,需要加锁。
语法格式
修改自增字段的下一个值:
ALTER TABLE table_name AUTO_INCREMENT = ai_val;
一张表仅支持具有一个自增字段,因此修改自增字段时仅需指定表名,无需指定自增字段名,数据库会找到该字段并修改其自增属性。
新增列:
ALTER TABLE table_name ADD [ COLUMN ] column_name column_clause [ FIRST | AFTER col_name ] ;
修改表已存在字段的属性:
ALTER TABLE table_name MODIFY [COLUMN] column_name column_clause [ FIRST | AFTER col_name ];
本文档仅列出部分语法,更多
ALTER TABLE
语法请参考ALTER TABLE。
参数说明
table_name
需要修改的表名。
ai_val
修改后自增字段的下一个值。
仅当ai_val的值大于当前自增字段的最大值时,修改才真正生效。
[ COLUMN ] column_name
现存的或新字段的名称。
其中COLUMN关键字可以隐去。
column_clause
列的定义语句。支持的字段属性包括:字段的数据类型、默认值、是否可为Null值、以及comment定义等。
更多有关此子句的内容详见SQL参考中的ALTER TABLE。
FIRST | AFTER
通过FIRST或者AFTER关键字指定新增字段的位置或修改后该字段的位置,该关键字可以与其它修改动作同时指定。
- FIRST:表示修改后该字段位于所有字段之首。
- AFTER:表示修改后该字段位于col_name字段之后。
本文档仅介绍部分参数含义,更多参数说明请参考ALTER TABLE参数说明。
示例
示例1: 修改自增列的下一个值。
1、创建带有auto_increment字段的表并插入数据。
create table test1(a int primary key AUTO_INCREMENT, b int);
insert into test1(b) values(1);
insert into test1(b) values(1);
insert into test1 values(0,3);
insert into test1 values(NULL,4);
2、查看测试表的当前数据。
select * from test1;
返回结果如下:
a | b
---+---
1 | 1
2 | 1
3 | 3
4 | 4
(4 rows)
3、修改自增字段的下一个值为10。
alter table test1 auto_increment = 10;
4、再次插入一条数据并查询结果。
insert into test1(b) values(1);
select * from test1;
返回结果如下,其中具有自增属性的列a的下一个值被修改为10:
a | b
----+---
1 | 1
2 | 1
3 | 3
4 | 4
10 | 1
(5 rows)
示例2: ALTER TABLE MODIFY
修改表字段。
1、创建测试表。
CREATE TABLE my_table_1156660 (
id INT PRIMARY KEY AUTO_INCREMENT,
age INT
);
2、查看测试表的表结构信息。
\d my_table_1156660
返回结果如下:
Table "public.my_table_1156660"
Column | Type | Modifiers | Attalias
--------+---------+-------------------------+----------
id | integer | not null AUTO_INCREMENT | id
age | integer | | age
Indexes:
"my_table_1156660_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
3、将字段age 的数据类型由integer修改为tinyint。
ALTER TABLE my_table_1156660 MODIFY age TINYINT;
4、再次查看测试表结构。
\d my_table_1156660
返回结果如下,其中age列的数据类型为integer:
Table "public.my_table_1156660"
Column | Type | Modifiers | Attalias
--------+---------+-------------------------+----------
id | integer | not null AUTO_INCREMENT | id
age | tinyint | | age
Indexes:
"my_table_1156660_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
5、向测试表中插入一条数据。
INSERT INTO my_table_1156660(age) VALUES (25);
6、查询数据。
select * from my_table_1156660;
返回结果为:
id | age
----+-----
1 | 25
(1 row)
7、修改字段age的约束及数据类型。
alter table my_table_1156660 modify column age int not null;
8、再次查看测试表结构。
\d my_table_1156660
返回结果如下,其中age列的数据类型为integer:
Table "public.my_table_1156660"
Column | Type | Modifiers | Attalias
--------+---------+-------------------------+----------
id | integer | not null AUTO_INCREMENT | id
age | integer | not null | age
Indexes:
"my_table_1156660_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
9、向测试表中插入一条数据,向字段age中插入一个空值。
insert into my_table_1156660 values(1);
返回结果如下,由于age列设定了非空约束,所以插入失败:
ERROR: null value in column "age" violates not-null constraint
DETAIL: Failing row contains (1, null).
示例3: 修改表时在ADD或MODIFY的同时指定FIRST/AFTER关键字。
1、创建测试表。
CREATE TABLE my_table_1156249 (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
2、新增字段new1_column,不指定其位置。
ALTER TABLE my_table_1156249 ADD COLUMN new1_column VARCHAR(100);
3、查看测试表的表结构。
\d my_table_1156249;
返回结果如下,在不指定新增字段位置的前提下,新增字段被插入到了表结构的末尾。
Table "public.my_table_1156249"
Column | Type | Modifiers | Attalias
-------------+--------------+-------------------------+-------------
id | integer | not null AUTO_INCREMENT | id
name | varchar(50) | | name
age | integer | | age
new1_column | varchar(100) | | new1_column
Indexes:
"my_table_1156249_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
4、插入新字段,指定其插入位置为表结构中所有字段的开头。
ALTER TABLE my_table_1156249 ADD COLUMN new2_column VARCHAR(100) FIRST;
5、查看当前测试表结构。
\d my_table_1156249;
返回结构如下,新增字段new2_column位于所有字段之首。
Table "public.my_table_1156249"
Column | Type | Modifiers | Attalias
-------------+--------------+-------------------------+-------------
new2_column | varchar(100) | | new2_column
id | integer | not null AUTO_INCREMENT | id
name | varchar(50) | | name
age | integer | | age
new1_column | varchar(100) | | new1_column
Indexes:
"my_table_1156249_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
6、插入新字段,指定其位置在字段“id”之后。
ALTER TABLE my_table_1156249 ADD COLUMN new3_column VARCHAR(10) AFTER id;
7、查看当前表结构。
\d my_table_1156249;
返回结构如下,新增字段new3_column被插入到了字段“id”的后面。
Table "public.my_table_1156249"
Column | Type | Modifiers | Attalias
-------------+--------------+-------------------------+-------------
new2_column | varchar(100) | | new2_column
id | integer | not null AUTO_INCREMENT | id
new3_column | varchar(10) | | new3_column
name | varchar(50) | | name
age | integer | | age
new1_column | varchar(100) | | new1_column
Indexes:
"my_table_1156249_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
8、修改当前已有字段new3_column,将其位置修改到age字段之后,同时将其数据类型改为VARCHAR(30)。
ALTER TABLE my_table_1156249 modify new3_column VARCHAR(30) AFTER age;
9、查看当前测试表结构。
\d my_table_1156249;
返回结果如下,new3_column字段的位置和数据类型均按预期完成了修改。
Table "public.my_table_1156249"
Column | Type | Modifiers | Attalias
-------------+--------------+-------------------------+-------------
new2_column | varchar(100) | | new2_column
id | integer | not null AUTO_INCREMENT | id
name | varchar(50) | | name
age | integer | | age
new3_column | varchar(30) | | new3_column
new1_column | varchar(100) | | new1_column
Indexes:
"my_table_1156249_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default