VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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