• 南大通用数据库-Gbase-8a-学习-40-修改字段类型、默认值、非空属性等


    目录

    一、环境信息

    二、ALTER TABLE语法树

    三、修改字段类型

    1、字段varchar类型修改实验

    2、其他类型修改实验

    四、修改字段默认值、非空属性

    五、总结


    一、环境信息

    名称
    CPUIntel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
    操作系统CentOS Linux release 7.9.2009 (Core)
    内存3G
    逻辑核数2
    Gbase8a版本8.6.2-R43.34.27468a27

    二、ALTER TABLE语法树

    1. ALTER TABLE [VCNAME.][database_name.]table_name
    2. alter_specification [, alter_specification] ...
    3. alter_specification:
    4. ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
    5. | ADD [COLUMN] (column_definition,...)
    6. | CHANGE [COLUMN] old_col_name new_col_name column_definition
    7. | MODIFY [COLUMN] col_name column_definition
    8. [FIRST | AFTER col_name]
    9. | RENAME [TO] new_table_name
    10. | DROP [COLUMN] col_name
    名称描述
    ADD [COLUMN]添加字段,关键字FIRST、AFTER分别表示添加到指定字段的前和后,如果不指定,就是添加到表尾。
    CHANGE [COLUMN]修改字段名,但不支持修改类型、非空、默认值等,但支持列注释。
    MODIFY [COLUMN]修改字段在表中的位置,其他同上。
    RENAME [TO]修改表名。
    DROP [COLUMN]删除字段。

    三、修改字段类型

    8a修改字段数据类型目前只支持varchar类型到varchar类型。

    1、字段varchar类型修改实验

    建测试表

    1. gbase> CREATE TABLE TEST_09_19 (A VARCHAR(10), B VARCHAR(100) NOT NULL DEFAULT 'TEST_DEFAULT_VAL' COMMENT'TEST', C INT);
    2. Query OK, 0 rows affected (Elapsed: 00:00:00.02)
    3. gbase> DESC TEST_09_19;
    4. +-------+--------------+------+-----+------------------+-------+
    5. | Field | Type | Null | Key | Default | Extra |
    6. +-------+--------------+------+-----+------------------+-------+
    7. | A | varchar(10) | YES | | NULL | |
    8. | B | varchar(100) | NO | | TEST_DEFAULT_VAL | |
    9. | C | int(11) | YES | | NULL | |
    10. +-------+--------------+------+-----+------------------+-------+
    11. 3 rows in set (Elapsed: 00:00:00.00)

    增加字段A的长度正常

    1. gbase> ALTER TABLE TEST_09_19 CHANGE A A VARCHAR(101);
    2. Query OK, 0 rows affected (Elapsed: 00:00:00.17)
    3. Records: 0 Duplicates: 0 Warnings: 0

    增加字段B的长度报错,注意需要加上默认值和非空、注释等

    1. gbase> ALTER TABLE TEST_09_19 CHANGE B B VARCHAR(101);
    2. ERROR 1702 (HY000): gcluster table error: This version of GBase doesn't yet support 'such options, check default value and comment'.

    我们加上再试试,执行正常。

    1. gbase> ALTER TABLE TEST_09_19 CHANGE B B VARCHAR(101) NOT NULL DEFAULT 'TEST_DEFAULT_VAL' COMMENT'TEST';
    2. Query OK, 0 rows affected (Elapsed: 00:00:00.10)
    3. Records: 0 Duplicates: 0 Warnings: 0

    如果我们只是变化默认值,其他不变看看,提示不支持修改默认值。

    1. gbase> ALTER TABLE TEST_09_19 CHANGE B B VARCHAR(101) NOT NULL DEFAULT 'TEST_DEFAULT_VAL1' COMMENT'TEST';
    2. ERROR 1702 (HY000): gcluster table error: This version of GBase doesn't yet support 'change default value'.

    如果我们只是变化注释,其他不变看看,执行正常。

    1. gbase> ALTER TABLE TEST_09_19 CHANGE B B VARCHAR(101) NOT NULL DEFAULT 'TEST_DEFAULT_VAL' COMMENT'TEST1';
    2. Query OK, 0 rows affected (Elapsed: 00:00:00.12)
    3. Records: 0 Duplicates: 0 Warnings: 0

    2、其他类型修改实验

    测试数据生成

    1. gbase> DESC TEST_09_19;
    2. +-------+--------------+------+-----+------------------+-------+
    3. | Field | Type | Null | Key | Default | Extra |
    4. +-------+--------------+------+-----+------------------+-------+
    5. | A | varchar(101) | YES | | NULL | |
    6. | B | varchar(101) | NO | | TEST_DEFAULT_VAL | |
    7. | C | int(11) | YES | | NULL | |
    8. +-------+--------------+------+-----+------------------+-------+
    9. 3 rows in set (Elapsed: 00:00:00.00)
    10. gbase> INSERT INTO TEST_09_19 VALUES('SUN','MOON',1);
    11. Query OK, 1 row affected (Elapsed: 00:00:00.28)
    12. gbase> INSERT INTO TEST_09_19 VALUES('SUN','MOON',2);
    13. Query OK, 1 row affected (Elapsed: 00:00:00.04)
    14. gbase> SELECT * FROM TEST_09_19;
    15. +------+------+------+
    16. | A | B | C |
    17. +------+------+------+
    18. | SUN | MOON | 1 |
    19. | SUN | MOON | 2 |
    20. +------+------+------+
    21. 2 rows in set (Elapsed: 00:00:00.41)

    测试int->varchar,提示:修改列定义,除了增加varchar长度都不支持。

    1. gbase> ALTER TABLE TEST_09_19 CHANGE C C VARCHAR(101);
    2. ERROR 1702 (HY000): gcluster table error: This version of GBase doesn't yet support 'ALTER column definition except increasing length of varchar'.

    那我们曲线救援,通过新建复制字段->更新数据到复制字段->删除老字段->修改复制字段名为老字段名的方式,来实现字段类型修改。

    1. gbase> ALTER TABLE TEST_09_19 ADD COLUMN C_CopyColumn VARCHAR(10) AFTER C;
    2. Query OK, 2 rows affected (Elapsed: 00:00:00.08)
    3. Records: 2 Duplicates: 2 Warnings: 0
    4. gbase> UPDATE TEST_09_19 SET C_CopyColumn = C;
    5. Query OK, 2 rows affected (Elapsed: 00:00:00.10)
    6. Rows matched: 2 Changed: 2 Warnings: 0
    7. gbase> ALTER TABLE TEST_09_19 DROP C;
    8. Query OK, 2 rows affected (Elapsed: 00:00:00.24)
    9. Records: 2 Duplicates: 2 Warnings: 0
    10. gbase> ALTER TABLE TEST_09_19 CHANGE C_CopyColumn C VARCHAR(10) COMMENT'';
    11. Query OK, 0 rows affected (Elapsed: 00:00:00.22)
    12. Records: 0 Duplicates: 0 Warnings: 0

    验证正确性

    1. gbase> DESC TEST_09_19;
    2. +-------+--------------+------+-----+------------------+-------+
    3. | Field | Type | Null | Key | Default | Extra |
    4. +-------+--------------+------+-----+------------------+-------+
    5. | A | varchar(101) | YES | | NULL | |
    6. | B | varchar(101) | NO | | TEST_DEFAULT_VAL | |
    7. | C | varchar(10) | YES | | NULL | |
    8. +-------+--------------+------+-----+------------------+-------+
    9. 3 rows in set (Elapsed: 00:00:00.01)
    10. gbase> SELECT * FROM TEST_09_19;
    11. +------+------+------+
    12. | A | B | C |
    13. +------+------+------+
    14. | SUN | MOON | 1 |
    15. | SUN | MOON | 2 |
    16. +------+------+------+
    17. 2 rows in set (Elapsed: 00:00:00.09)

    四、修改字段默认值、非空属性

    通过上面的实验和语法树了解,8a暂时不支持通过ALTER语句修改字段默认值、非空属性,只有通过重建表来曲线救援了,如果有其他大佬知道的,可以分享大家一起学习一下。

    五、总结

    1、ALTER TABLE CHANGE语句只支持VARCHAR到VARCHAR的类型转换,且是小范围到大范围的。

    2、ALTER TABLE CHANGE语句支持注释修改。

    3、其他类型修改需要通过:新建复制字段->更新数据到复制字段->删除老字段->修改复制字段名为老字段名的方式实现。

    4、字段默认值、非空属性等需要通过重建表来实现。

  • 相关阅读:
    css 占位隐藏
    记一次线上bug排查-----SpringCloud Gateway组件 请求头accept-encoding导致响应结果乱码
    【代码随想录】算法训练计划14
    三大云厂商 ARM 架构服务器性能对比
    面试题:volatile能否保证线程安全
    AtomicLong与LongAdder(下)
    C++桌面应用开发(Qt学习)——控件(2)ItemWidget
    python-(6-2)爬虫---小试牛刀,获得网页页面内容
    Web框架Gin
    Docker
  • 原文地址:https://blog.csdn.net/qq_45111959/article/details/133031762