金仓数据库KingbaseES数据库管理员指南--13表的管理

目录

13.1. 关于表

13.2. 表管理指南

13.2.1. 创建表之前的设计准则

13.2.2. 指定表的存储位置

13.2.3. 在创建表时考虑使用UNLOGGED

13.2.4. 评估表格大小和相应的规划

13.3. 创建表

13.3.1. 例子:创建表

13.3.2. 创建临时表

13.4. 加载表

13.4.1. sys_bulkload工具快速加载数据

13.4.2. 使用CREATE TABLE AS语句

13.4.3. 使用INSERT语句

13.4.4. 使用MERGE语句

13.4.5. 使用COPY语句

13.5. 收集数据库的统计信息

13.6. 修改表

13.6.1. 增加列

13.6.2. 移除列

13.6.3. 增加约束

13.6.4. 移除约束

13.6.5. 修改列的默认值

13.6.6. 修改列的数据类型

13.6.7. 重命名列

13.6.8. 重命名表

13.7. 删除表

13.8. 使用FLASHBACK删除和恢复表

13.8.1. 什么是回收站

13.8.2. 启用和禁用回收站

13.8.3. 从回收站恢复表

13.9. 管理分区表

13.10. 表的数据视图


表的管理包括创建表、加载表、修改表和删除表等任务。

表是数据库中数据存储的基本单元,数据存储在表的行和列中。

遵循这些准则可以使表的管理更加容易,并且可以提高创建表、加载表更新以及查询表的性能。

使用SQL语句CREATE TABLE创建表。

有多种将数据加载到表中的技术。

sys_stat_statement工具允许您生成数据库的统计信息。您可以使用此工具来收集的数据库性能统计信息。

使用ALTER TABLE语句修改表。要修改一个表,表必须包含在您的模式中,或者您必须具有该表的ALTER对象权限或ALTER ANY TABLE系统权限。

可以使用DROP TABLE语句,删除不再需要的表。

删除表时,数据库不会立即删除与该表关联的空间。数据库重命名表,并将其和任何关联的对象放在回收站中,万一表被错误地删除,可以在稍后恢复。这个特性被称为FLASHBACK DROP, FLASHBACK TABLE语句则用于恢复表。

分区表可以将数据分割为更小、更易于管理的小单位,称为分区,甚至是更小的子分区。每个分区可以有单独的物理属性,例如物理存储设置和表空间,能有效提升大型表的访问效率。此外,可以单独管理每个分区,可以简化和减少备份和管理所需的时间。

您可以查询一组数据字典视图,以了解有关表的信息。

13.1. 关于表

表是为数据库中数据存储的基本单位,数据存储在行和列中。表中列的个数和顺序是固定的。在创建基本表时,要对表中的所有列进行说明,要说明它的名称、数据类型、宽度或精度等。已经说明的列也可以使用SQL语句修改。

在逻辑结构上,一个表位于某个表空间上,当创建表时,同时将创建一个表段,用于存放表中的数据。在物理结构上,表的数据都放在数据块中,数据块中存放的就是一行的数据结构。同时,一般而言,表的各行数据是以写入的先后顺序存放,而一行的各列一般按照定义表时的指定顺序存放。

列的数据类型限制了该列取值,以及说明了该列进行计算时,存储在该列上的数据的语义。例如,一个列声明为INTEGER类型,则其中就不能存放字符串数据,该列的数据可以进行数学运算。同样,一个列声明为字符串类型,则其中可以存放任何数据,但该列的数据不可以进行数学运算。

您可以为表的每一列指定限制规则。这些限制规则称为完整性约束。一个典型例子是NOT NULL完整性约束。此约束强制列在每一行中包含一个值。 您可以调用透明数据加密来在存储数据之前对数据进行加密。如果用户试图绕过数据库访问控制机制,直接使用操作系统工具查看数据文件,加密会阻止这些用户查看敏感数据。

另请参阅

  • KingbaseES数据库SQL语言获取关于数据类型的描述信息

  • KingbaseES数据库安全指南获取关于透明数据加密相关信息

父主题: 表的管理

13.2. 表管理指南

遵循这些准则可以使表的管理更加容易,并且可以提高创建表、加载表更新以及查询表的性能。

通常,应用程序开发人员负责设计应用程序的元素,包括表。数据库管理员负责建立用于保存应用程序表的底层表空间的属性。

建议在CREATE TABLE语句中指定TABLESPACE子句,以标识将要存储新表的表空间。对于分区表,您可以选择标识用于存储每个分区的表空间。

要最有效地创建表,可以使用CREATE UNLOGGED TABLE...AS语句。如果指定了UNLOGGED,则创建的表将不做日志。

在创建表之前估计表的大小。最好将此作为数据库规划的一部分。了解数据库表的大小和用途是数据库规划的一个重要部分。

父主题: 表的管理

13.2.1. 创建表之前的设计准则

通常,应用程序开发人员负责设计应用程序的元素,包括表。数据库管理员负责建立用于保存应用程序表的底层表空间的属性。DBA或应用程序开发人员,或者两者共同工作,可以负责实际创建表,这取决于站点的实践。与应用程序开发人员合作,在设计表时考虑以下准则:

  • 对表、列、索引和聚簇使用描述性名称。

  • 使用COMMENT命令记录每个表及其列的含义。

  • 标准化每个表。

  • 为每个列选择适当的数据类型。

  • 考虑向某些表添加一个或多个虚拟列是否使您的应用程序从中受益。

  • 定义允许最后为空的列,以节省存储空间。

  • 聚簇表在任何时候都是合适的,可以实现节省存储空间并优化SQL语句的性能。

在创建表之前,还应该确定是否使用完整性约束。可以在表的列上定义完整性约束,将自动执行数据库的业务规则。

父主题: 表管理指南

13.2.2. 指定表的存储位置

建议在使用CREATE TABLE语句时指定TABLESPACE子句,可对表指定存储的表空间。对于分区表,您可以选择指定存储每个分区的表空间。如果没有指定,则该表将创建在用户的默认表空间中。在创建表时,通过指定合适的表空间,有以下优点:

  • 提高数据库系统的性能,因为不同的数据库表可能对应不同的数据文件,可减少对相同文件的竞争;

  • 减少数据库管理的时间,数据库表分布在不同的表空间中,即使一个表空间损坏,也不影响其他表空间上数据库表的正常访问。

父主题: 表管理指南

13.2.3. 在创建表时考虑使用UNLOGGED

要最有效地创建表,可以使用CREATE UNLOGGED TABLE...AS语句。如果指定了UNLOGGED,则创建的表将不做日志。

使用UNLOGGED子句有以下好处:

  • 省去重做日志文件,节省了一定的空间。

  • 创建表的时间会减少。

  • 并行创建大型表性能得到提升。

父主题: 表管理指南

13.2.4. 评估表格大小和相应的规划

创建表之前,先进行表大小的评估,并且建议将该评估结果作为数据库规划的一部分。了解数据库表的大小和用途是数据库规划的一个重要部分。

您可以连同索引、撤消空间和重做日志文件的大小一起评估,综合评估表的空间,来确保数据库所需的磁盘空间量。根据估计结果,您就可以购买合适容量的磁盘硬件。

父主题: 表管理指南

13.3. 创建表

要在所属模式中创建新表,需要有CREATE TABLE数据库权限;而要在其他用户的模式中创建新表,则需要有 CREATE ANY TABLE 数据库权限。

创建表时,如果给定了一个模式名(例如CREATE TABLE myschema.mytable...),那么该表被创建在指定的模式中,否则它被创建在当前模式中。

若干创建表的例子。

临时表在需要缓冲结果集的应用程序中很有用,因为它是通过运行多个DML操作构建的。您可以创建全局临时表或者局部临时表。

父主题: 表的管理

13.3.1. 例子:创建表

若干创建表的例子。

创建distributors表,并为name列定义一个唯一约束:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);

执行下列语句后,在hr模式中创建了一个名为emp的表,并将其存储在tbs0表空间中,并定义了主键约束,其中包含定义在不同列上的一个主键:

CREATE TABLE hr.emp (
    code        char(12) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT code_title PRIMARY KEY(code,title)
)TABLESPACE tbs0;

创建distributors表,指定表和它的唯一索引指定 70% 的填充因子:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);

创建一个范围分区表:

CREATE TABLE measurement (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

另请参阅:

请参阅SQL语言手册获取关于 CREATE TABLE 语句更多创建例子

父主题: 创建表

13.3.2. 创建临时表

临时表在应用程序需要缓冲结果集时很有用,因为它是通过运行多个DML操作构建的。您可以创建全局临时表或者局部临时表。

临时表保存的数据仅在事务或会话期间存在。

在创建临时表时,一些应该关注的注意事项。

临时表在一个事务块结束时的行为由ON COMMIT控制。

全局临时表是存储在磁盘上的永久数据库对象,对连接到数据库的所有会话都可见。

局部临时表是在事务或会话结束时删除的临时数据库对象,每个临时表只对创建它的会话可见。

另请参阅:

请参阅SQL语言中 CREATE TABLE 获取关于创建临时表的详细语法和描述

父主题: 创建表

13.3.2.1. 临时表概述

临时表保存的数据仅在事务或会话期间存在。临时表中的数据是会话私有的。每个会话只能看到和修改自己的数据。 简单来看全局临时表定义是持久的,而表数据是临时的,而本地临时表的表定义和表数据都是临时的,会在会话退出后被删除。

本地临时表和全局临时表具体有如下四点区别:

  • 1.本地临时表在临时模式下,用户不可以指定;但是全局临时表创建在用户指定模式下;

  • 2.本地临时表对象本身并不是一直存在,在会话退出后,本地临时表会被删除;全局临时表创建之后,一直存在,除非显示去删除它。

  • 3.删除本地临时表,不受其他会话影响;但是删除全局临时表时,所有会话都不能持有全部临时表的数据。

  • 4.全局临时表不支持外键约束也不支持其他表引用全局临时表作为外键约束,而本地临时表没有这个要求。

父主题: 创建临时表

13.3.2.2. 创建临时表的注意事项

在创建临时表时,一些应该关注的注意事项。

只有当当前没有会话绑定到一个现有临时表时,才允许在这个临时表上执行DDL操作(TRUNCATE除外)。如果事务回滚,则输入的数据将丢失,但表定义仍然存在。特定于事务的临时表一次只允许一个事务。如果在一个事务作用域中有多个自治事务,则每个自治事务只能在前一个事务提交之后才能使用该表。

由于临时表中的数据根据定义是临时的,所以当系统发生故障时,临时表数据的备份和恢复功能是不可用的。为了应对这种故障,应该开发时需要其他方法来保存临时表数据。

父主题: 创建临时表

13.3.2.3. 临时表事务控制

临时表在一个事务块结束时的行为由ON COMMIT控制。

三种选项具体是:

  • PRESERVE ROWS

在事务结束时不采取特殊的动作。是本地临时表采用的默认行为

  • DELETE ROWS

在每一个事务块结束时将删除临时表中的所有行。实质上,在每一次提交时会完成一次 自动的 TRUNCATE 。 在分区表上使用时,不会将其级联到其分区。这是全局临时表的默认行为。

  • DROP

在当前事务块结束时将删除临时表。在分区表上使用时,此操作将删除其分区,在具有继承子级的表上使用时,将删除依赖子级。仅本地临时表支持在当前事务块结束时将删除临时表。为兼容Oracle,全局临时表不支持ON COMMIT DROP选项。

父主题: 创建临时表

13.3.2.4. 创建全局临时表

全局临时表是存储在磁盘上的永久数据库对象,对连接到数据库的所有会话都可见。

全局临时表的定义对所有会话都是可见的,但是全局临时表中的数据只对向表中插入数据的会话可见。您使用CREATE GLOBAL TEMPORARY TABLE语句创建一个全局临时表。

下列示例演示了如何创建全局临时表。 这条语句创建了一个特定于事务的全局临时表:

CREATE GLOBAL TEMPORARY TABLE admin_work_area_trans
        (startdate DATE,
         enddate DATE,
         class CHAR(20))
      ON COMMIT DELETE ROWS;

这条语句创建了一个特定于会话的全局临时表:

CREATE GLOBAL TEMPORARY TABLE admin_work_area_session
        (startdate DATE,
         enddate DATE,
         class CHAR(20))
      ON COMMIT PRESERVE ROWS;

父主题: 创建临时表

13.3.2.5. 创建局部临时表

局部临时表的元数据和内容仅在创建该临时表的会话中可见。 局部临时表在以下情况下很有用:

  • 当应用程序将临时数据存储在临时表中时,这些临时表只填充一次,读取几次,然后在事务或会话结束时删除

  • 当一个会话被无限期地维护,并且必须为不同的事务创建不同的临时表时

  • 创建临时表时,不能启动新事务或提交现有事务

  • 当同一个用户的不同会话必须对一个临时表使用相同的名称时

使用CREATE LOCAL TEMPORARY TABLE语句创建一个局部临时表。LOCAL可以不指定,因为默认是局部临时表。

下列示例演示如何创建局部临时表。这条语句创建了一个特定于事务的局部临时表:

CREATE LOCAL TEMPORARY TABLE sales_ptt_transaction
    (time_id      DATE,
     amount_sold  NUMBER(10,2))
   ON COMMIT DELETE ROWS;

这条语句创建了一个局部临时表,它是特定于会话的:

CREATE LOCAL TEMPORARY TABLE sales_ptt_session
    (time_id      DATE,
     amount_sold  NUMBER(10,2))
   ON COMMIT PRESERVE ROWS;

默认情况下,局部临时表中的行存储在创建它的用户的默认临时表空间中。但是,在创建临时表的过程中,可以通过CREATE LOCAL TEMPORARY TABLE语句的TABLESPACE子句将一个局部临时表分配给另一个临时表空间。

父主题: 创建临时表

13.4. 加载表

有几种方法可以将数据插入或初始加载到表中。

最常用的是以下几种:

sys_bulkload是KingbaseES提供的快速加载数据的命令行工具,该工具能够把一定格式的文本数据简单、快速的加载到KingbaseES数据库中。

使用此SQL语句,您可以创建一个表,并使用从另一个现有表(包括外部表)选择的数据填充该表数据。

INSERT语句允许您通过指定列值或指定从另一个现有表选择数据的子查询向表添加行。

通过从另一个现有表中选择行,可以使用MERGE语句向表中插入行或更新行。如果新数据中的一行对应于表中已经存在的项,则执行UPDATE,否则执行INSERT。

COPY语句允许您将KingbaseES表和标准文件系统文件之间相互转移数据。可以实现将表的内容复制到文件,也可以将文件复制数据到表,甚至复制一个SELECT查询结果。

父主题: 表的管理

13.4.1. sys_bulkload工具快速加载数据

sys_bulkload是KingbaseES提供的快速加载数据的命令行工具,该工具能够把一定格式的文本数据简单、快速的加载到KingbaseES数据库中。

创建导入数据表

create TABLE test(id int primary key, info text, crt_time timestamp);

数据文件示例:将下列数据以 test.csv 为文件名保存到KingbaseES服务器所在目录

1,29b35ff06c949e7e442c929e1df86396,2017-10-08 10:52:47.746062
2,06fde814525395de5ab85f6d92b04e87,2017-10-08 10:52:47.746573
3,c93f02e8677c9cd7c906c6ad5dbd450e,2017-10-08 10:52:47.746627
4,6541700070ae3d051f965fcef43baf45,2017-10-08 10:52:47.746835
5,3d7e7246016acaa842526b6614d0edf5,2017-10-08 10:52:47.746869
6,1d1ae5a03ef0bad3bc14cd5449ba0985,2017-10-08 10:52:47.746894
7,7745c57c54b97656bec80a502ec13ec7,2017-10-08 10:52:47.746918
8,3c377131f6ef82c3284dc77a3b4ffdf7,2017-10-08 10:52:47.746942
9,5ef98d40aeeadf65eb1f0d7fd86ed585,2017-10-08 10:52:47.746968
10,312c0a0188da9e34fe45aa19d0d07427,2017-10-08 10:52:47.746993

导入数据

1,以 BUFFERED 方式导入 TEXT 文件配置文件示例(以test.ctl为名保存到服务器所在目录,也可自行指定其他目录。)

TABLE = test
INPUT = /home/kingbase/test.csv
TYPE = CSV
SKIP = 2
LIMIT = 5
WRITER = BUFFERED
PROCESSOR_COUNT = 3

2,使用配置文件导入命令示例

./sys_bulkload -h localhost -d TEST /home/kingbase/test.ctl -U SYSTEM -W 123456

3,使用配置文件导入结果

导入成功提示信息:
    NOTICE: BULK LOAD START
    NOTICE: BULK LOAD END
        2 Rows skipped.
        5 Rows successfully loaded.
        0 Rows not loaded due to parse errors.
        0 Rows not loaded due to duplicate errors.
        0 Rows replaced with new rows.
    log path: /home/test/test.log
    parse error path: /home/test/test.bad
    duplicate error path: /home/test/test.dupbad
    ctrl file path: /home/test/test.ctl
    data file path: /home/test/test.csv
    Run began on 2021-03-27 22:53:26.690476+08
    Run ended on 2021-03-27 22:53:27.496344+08

导入结果查询(配置指定跳过前2行,限制导入条数5条):

test=# select * from test;
 id |               info               |          crt_time
----+----------------------------------+----------------------------
  3 | c93f02e8677c9cd7c906c6ad5dbd450e | 2017-10-08 10:52:47.746627
  4 | 6541700070ae3d051f965fcef43baf45 | 2017-10-08 10:52:47.746835
  5 | 3d7e7246016acaa842526b6614d0edf5 | 2017-10-08 10:52:47.746869
  6 | 1d1ae5a03ef0bad3bc14cd5449ba0985 | 2017-10-08 10:52:47.746894
  7 | 7745c57c54b97656bec80a502ec13ec7 | 2017-10-08 10:52:47.746918
(5 行记录)

另请参阅:

请参阅 KingbaseES客户端应用参考手册 获取关于sys_bulkload详细选项描述和示例

父主题: 加载表

13.4.2. 使用CREATE TABLE AS语句

CREATE TABLE AS创建一个表,并且用由一个SELECT命令计算出来的数据填充该表。该表的列具有和SELECT的输出列相关的名称和数据类型(不过可以通过给出一个显式的新列名列表来覆 盖这些列名)。

CREATE TABLE AS和创建一个视图有些相似,但是实际上非常不同:它会创建一个新表并且只计算该查询一次用来初始填充新表。这个新表将不会跟踪该查询源表的后续变化。相反,一个视图只要被查询,它的定义SELECT 语句就会被重新计算。

创建一个新表films_new,它只由表``films``中最近一段时间的项组成:

CREATE TABLE films_new AS
  SELECT * FROM films WHERE date_prod >= '2022-01-01';

要完全地复制一个表,也可以使用TABLE命令的 简短形式:

CREATE TABLE films_copy AS
  TABLE films;

用一个预备语句创建一个新的临时表films_new,它仅由表films中最近的项组成。新表将在提交时被删除:

PREPARE recentfilms(date) AS
  SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_new ON COMMIT DROP AS
  EXECUTE recentfilms('2002-01-01');

另请参阅:

请参阅 KingbaseES SQL语言参考手册 获取关于CREATE TABLE AS详细语法描述和示例

父主题: 加载表

13.4.3. 使用INSERT语句

INSERT语句允许您通过指定列值或指定从另一个现有表选择数据的子查询向表添加行。

例如,当在表之间拷贝值时,这个OVERRIDING USER VALUE子句就能派上用场,下面这个例子将从tbl1中拷贝所有在tbl2中不是标识列的列, 而tbl2中标识列的值将由与tbl2关联的序列产生。

INSERT INTO tbl2 OVERRIDING USER VALUE SELECT * FROM tbl1;

这个例子从表tmp_films中获得一些行插入到表``films``中,两个表具有相同的列布局:

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2022-05-07';

另请参阅:

请参阅SQL语言手册获取关于INSERT详细语法描述和示例

父主题: 加载表

13.4.4. 使用MERGE语句

使用MERGE语法可合并UPDATE和INSERT语句功能。通过MERGE语句,根据一张表(或视图)的连接条件对另外一张表(或视图)进行查询,连接条件匹配上的执行 UPDATE(可能含有 DELETE),无法匹配的执行INSERT。其中数据表包括:普通表、分区表。

这个例子创建了两个表test1和test2,并且进行条件匹配,将结果合并到test2中:

create table test1(a int, b int);
insert into test1 values(1, 1);
insert into test1 values(2, 2);
insert into test1 values(3, 3);

create table test2(x int, y int);
insert into test2 values(1, 1);
insert into test2 values(3, 3);
insert into test2 values(5, 5);

merge into test2 using test1
on (test1.a = test2.x)
when matched then
update set y = y * -1 where test1.a > 1
when not matched then
insert values(test1.a, test1.b);

执行后test2结果:

x | y
---+----
 1 |  1
 5 |  5
 2 |  2
 3 | -3
(4 rows)

执行后test1结果:

a | b
---+----
 1 |  1
 2 |  2
 3 |  3
(3 rows)

父主题: 加载表

13.4.5. 使用COPY语句

COPY语句允许您将KingbaseES表和标准文件系统文件之间相互转移数据。可以实现将表的内容复制到文件,也可以将文件复制数据到表,甚至复制一个SELECT查询结果。

  • COPY TO把一个表的内容复制到一个文件;

  • COPY FROM 则从一个文件复制数据到一个表(把数据追加到表中原有数 据);

  • COPY TO也能复制一个 SELECT查询的结果。

COPY TO只能被用于纯粹的表,不能用于视图。 不过您可以写COPY (SELECT * FROM viewname) TO...来拷贝一个视图的当前内容。

COPY FROM可以被用于普通表、外部表、分区表或者具有INSTEAD OF INSERT触发器的视图。

COPY只处理提到的表,它不会从子表复制 数据或者复制数据到子表中。例如 COPY table TO 会显示与SELECT * FROM ONLY table相同的数据。而COPY (SELECT * FROM table) TO ... 可以被用来转储一个继承层次中的所有数据。

1,下面的例子使用竖线(|)作为域定界符把country表复制到客户端:

COPY country TO STDOUT (DELIMITER '|');

2,从文件country_data中复制数据到country表中:

COPY country FROM '/usr1/proj/bray/sql/country_data';

3,只把名称以 'A' 开头的国家复制到文件a_list_countries.copy中:

COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO
'/usr1/proj/bray/sql/a_list_countries.copy';

另请参阅:

请参阅SQL语言手册获取关于 COPY 语句详细语法和示例信息

父主题: 加载表

13.5. 收集数据库的统计信息

数据库内部提供了多种性能视图和工具,将允许您生成数据库的统计信息。您可以使用诸如sys_stat_statements工具来收集相关的性能统计信息。数据库运行时的状态对分析某些性能问题的分析至关重要,我们可用通过对系统状态统计信息、日志信息的分析,来监控整个数据库的运行状态,并能从其中发现一些性能相关的问题。

跟数据库性能相关的信息和工具主要包括:

整体分析

sys_kwr报告工具(基本覆盖所有优化点分析)

sys_ksh工具

CPU优化点分析

耗时语句统计:

sys_stat_statements

kbbadger

会话/负载/等待事件分析

sys_stat_activity视图(实时)

sys_ksh报告工具(时间区间)

锁优化点分析

sys_locks视图

IO优化点分析分析

sys_statio_user_tables视图

sys_statio_user indexes视图

应用特点分析

sys_stat_user_tables视图

sys_stat_user_indexes视图

sys_stat_database视图

另请参阅:

请参阅 KingbaseES数据库性能调优指南 手册的性能诊断部分获取关于数据库资源分析详细信息

父主题: 表的管理

13.6. 修改表

和修改表中所包含的数据不同,有时当创建表并且填充数据后,有可能需要修改表的定义或者说结构,这一类操作可以使用alter TABLE语句修改表。

要修改一个表,表必须包含在您的模式中,或者您必须具有该表的ALTER对象权限或ALTER ANY TABLE系统权限。 KingbaseES提供了一族命令来对已有的表进行修改。通过更改表,用户可以对数据库中的表作如下修改:

为表新增加一列。

移除表中的现有列。

给表增加约束条件。

移除表中的现有约束。

修改一个列的默认值。

将一个列的数据类型转换为另一种数据类型。

重命名一个现有列。

修改表的名字。

另请参阅:

请参考SQL语言手册中的 ALTER TABLE 语句获取更详细的信息。

父主题: 表的管理

13.6.1. 增加列

要增加一个列,可以使用这样的命令:

ALTER TABLE products ADD COLUMN description text;

新列将被默认值所填充(如果没有指定DEFAULT子句,则会填充空值)。

在KingbaseES V8R6 ,添加具有常量默认值的列不再意味着在执行ALTER TABLE语句时需要更新表的每一行。相反,默认值将在下一次访问该行时返回,并在重写表时应用,这使得 ALTER TABLE非常快,即使在大型表上也是如此。

但是,如果默认值是volatile (e.g. clock_timestamp()),每一行都需要在执行ALTER TABLE时计算出的值来更新。以避免潜在的冗长的更新操作,特别是如果你打算填列主要是默认的值,它可能是更可取的添加没有默认的列,使用UPDATE插入正确的值,然后添加任何所需的默认如下所述。

也可以同时为列定义约束,语法:

ALTER TABLE products ADD COLUMN description text CHECK (description <> '');

事实上CREATE TABLE中关于一列的描述都可以应用在这里。记住不管怎样,默认值必须满足给定的约束,否则ADD将会失败。也可以先将新列正确地填充好,然后再 增加约束 。

父主题: 修改表

13.6.2. 移除列

为了移除一个列,使用如下的命令:

ALTER TABLE products DROP COLUMN description;

列中的数据将会消失,涉及到该列的表约束也会被移除。然而,如果该列被另一个表的外键所引用,KingbaseES不会移除该约束。我们可以通过增加CASCADE来授权移除任何依赖于被删除列的所有东西:

ALTER TABLE products DROP COLUMN description CASCADE;

父主题: 修改表

13.6.3. 增加约束

在现有表基础上新增加约束,可以使用表约束的语法,例如:

ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;

要增加一个不能写成表约束的非空约束,可使用语法:

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

该约束会立即被检查,所以表中的数据必须在约束被增加之前就已经符合约束。

父主题: 修改表

13.6.4. 移除约束

为了移除一个约束首先需要知道它的名称。如果在创建时已经给它指定了名称,那么事情就变得很容易。否则约束的名称由系统生成,我们必须先找出这个名称。ksql的命令d表名将会对此有所帮助,其他接口也会提供方法来查看表的细节。因此命令是:

ALTER TABLE products DROP CONSTRAINT some_name;

(如果处理的是自动生成的约束名称,如$2,别忘了用双引号使它变成一个合法的标识符。)

和移除一个列相似,如果需要移除一个被某些对象依赖的约束,也需要加上CASCADE。一个典型的例子是一个外键约束依赖于被引用列上的一个唯一主键约束。

这对除了非空约束之外的所有约束类型都一样有效。为了移除一个非空约束可以用:

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

(回忆一下,非空约束是没有名称的,所以不能用第一种方式。)

父主题: 修改表

13.6.5. 修改列的默认值

要为一个列设置一个新默认值,使用命令:

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

注意这不会影响任何表中已经存在的行,它只是为未来的INSERT命令改变了默认值。 要移除任何默认值,使用:

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

这等同于将默认值设置为空值。相应的,试图删除一个未被定义的默认值并不会引发错误,因为默认值已经被隐式地设置为空值。

父主题: 修改表

13.6.6. 修改列的数据类型

为了将一个列转换为一种不同的数据类型,使用如下命令:

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

只有当列中的每一个项都能通过一个隐式造型转换为新的类型时该操作才能成功。如果需要一种更复杂的转换,应该加上一个USING子句来指定应该如何把旧值转换为新值。

KingbaseES将尝试把列的默认值转换为新类型,其他涉及到该列的任何约束也是一样。但是这些转换可能失败或者产生奇特的结果。因此最好在修改类型之前先删除该列上所有的约束,然后在修改完类型后重新加上相应修改过的约束。

父主题: 修改表

13.6.7. 重命名列

要重命名一个现有表的列,使用如下命令:

ALTER TABLE products RENAME COLUMN product_no TO product_number;

父主题: 修改表

13.6.8. 重命名表

要重命名一个现有表,使用如下命令:

ALTER TABLE products_table RENAME TO products_items;

products_table表将被重命名为products_items。

父主题: 修改表

13.7. 删除表

当一个表不再使用时,可以将其删除。删除表时,将产生以下结果:

  • 表的结构信息从数据字典中删除,表中的数据不可访问;

  • 表上的所有索引和触发器被一起清除;

  • 所有建立在该表上的同义词、视图和存储过程变为无效;

一般情况下,普通用户只能删除自己模式下的表。若要删除其他模式下的表,则必须具有 DROP ANY TABLE 数据库权限。

以下语句可删除 emp 表:

DROP TABLE emp;

如果要删除的表被其他表引用,即其他表的外键引用了表的任何主键或唯一键,则需要在 DROP TABLE 语句中包含 CASCADE 选项,如:

DROP TABLE emp CASCADE

当您删除一个表时,数据库通常不会立即释放与该表关联的空间。相反,数据库会重命名表并将其放入回收站,如果您发现错误地删除了该表,则可以使用FLASHBACK TABLE语句在回收站中恢复该表。如果您希望在发出DROP TABLE语句时立即释放与表相关的空间,请包含如下语句所示的PURGE子句:

DROP TABLE hr.emp PURGE;

父主题: 表的管理

13.8. 使用FLASHBACK删除和恢复表

删除表时,数据库不会立即删除与该表关联的空间。数据库重命名表,并将其和任何关联的对象放在回收站中,万一表被错误地删除,可以在稍后恢复。这个特性被称为FLASHBACK DROP, FLASHBACK TABLE语句用于恢复表。

回收站实际上是一个数据字典表,包含关于被删除对象的信息。被删除的表和任何关联的对象(如索引、约束、嵌套表等)没有被删除,仍然会占用空间。

当回收站被启用时,被删除的表及其相关对象将被放入回收站。当回收站被禁用时,被删除的表及其相关对象不会被放入回收站;它们已被删除,您必须使用其他方法来恢复它们(例如从备份中恢复)

使用FLASHBACK TABLE ... TO BEFORE DROP语句从回收站中恢复表。

另请参阅:

请参阅 KingbaseES SQL语言参考手册 中获取关于FLASHBACK DROP TABLE更多详细信息

父主题: 表的管理

13.8.1. 什么是回收站

回收站实际上是一个数据字典表,包含关于被删除对象的信息。被删除的表和任何关联的对象(如索引、约束、嵌套表等)没有被删除,仍然会占用空间。这些已删除的对象会继续占用用户空间,直到从回收站中清除它们。 用户可以使用以下语句查看回收站中的对象:

SELECT * FROM RECYCLEBIN;

只有SQL语句,DROP TABLE 语句会将对象放入回收站。它添加表及其关联对象,以便它们可以作为一个组数据一起进行恢复。除了表本身,添加到回收站的关联对象可以包括以下类型的对象:

  • 嵌套表

  • LOB数据库字段

  • 索引

  • 约束(不包括外键约束)

  • 触发器

  • 聚簇

DROP TABLE若是开启了GUC参数:kdb_flashback.db_recyclebin=on且未指定PURGE选项,则删除的表及其关联的索引、规则、触发器、约束等将被放到SYS_RECYCLEBIN系统表中。 在需要时可以将回收站中的表闪回到删除之前的状态。

父主题: 使用FLASHBACK删除和恢复表

13.8.2. 启用和禁用回收站

回收站功能默认关闭,可以通过下列命令查看是否开启回收站功能:

show kdb_flashback.db_recyclebin;

开启回收站功能,在登录数据库后执行以下命令即可

alter system set

父主题: 使用FLASHBACK删除和恢复表

13.8.3. 从回收站恢复表

开启了回收站参数后,如果不允许一个删除的表进回收站,需要在DROP语句后面加上``PUGRE``X选项。flashback支持将一个已经删除到回收站中的表及相关对象闪回到删除之前状态。

如果在当前schema下已经存在同名的表,则闪回失败,需要使用rename to选项指定一个新的表名。 成功闪回一个表后,回收站视图recyclebin和回收站系统表sys_recyclebin中对象将被清除。

一个FLASHBACK命令:

FLASHBACK TABLE TABLE_name TO BEFORE DROP;

这个命令将在回收站中的TABLE_name闪回到闪回之前的状态:

FLASHBACK TABLE TABLE_name TO BEFORE DROP RENAME TO newname;

将回收站中的表闪回到一个新的表名:

要将删除的表放到回收站需要在kingbase.conf配置文件末尾添加kdb_flashback.db_recyclebin=on。

父主题: 使用FLASHBACK删除和恢复表

13.9. 管理分区表

分区表可以将数据分割为更小、更易于管理的小单位,称为分区,甚至是更小的子分区。每个分区可以有单独的物理属性,例如物理存储设置和表空间,能有效提升大型表的访问效率。此外,可以单独管理每个分区,可以简化和减少备份和管理所需的时间。

另请参阅:

请参阅 KingbaseES数据库概念 手册获取关于分区表管理方面的详细信息

父主题: 表的管理

13.10. 表的数据视图

KingbaseES提供了一组兼容Oracle的视图,您可以用来查询一组数据字典视图,获取表的信息。

另请参阅:

请参阅KingbaseES系统表和视图手册,获取关于兼容Oracle视图详细列表和信息

父主题: 表的管理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人大金仓数据库开发管理工具KStudio是一款功能齐全、易于上手的数据库管理工具。它提供了一个简洁易懂的界面,使得初学者和有经验的开发人员都能够轻松地操作Kingbase ES数据库。KStudio客户端具有以下功能: 1. 数据库连接管理:KStudio客户端可以轻松地连接到Kingbase ES数据库,并提供了一个简单易用的界面来管理数据库连接。 2. 数据库对象管理:KStudio客户端可以管理Kingbase ES数据库中的所有对象,包括、视图、存储过程、触发器等等。 3. SQL编辑器:KStudio客户端提供了一个强大的SQL编辑器,可以帮助开发人员编写和调试SQL语句。 4. 数据导入和导出:KStudio客户端可以轻松地将数据导入和导出到Kingbase ES数据库中。 5. 数据库备份和还原:KStudio客户端可以帮助开发人员轻松地备份和还原Kingbase ES数据库。 6. 数据库性能监控:KStudio客户端可以监控Kingbase ES数据库的性能,并提供了一些有用的性能指标和报告。 以下是一个使用KStudio客户端连接Kingbase ES数据库的Python代码示例: ```python import pyodbc # 连接数据库 cnxn = pyodbc.connect('DRIVER={KingbaseES ODBC Driver};SERVER=localhost;PORT=54321;DATABASE=mydatabase;UID=myusername;PWD=mypassword') # 执行SQL查询 cursor = cnxn.cursor() cursor.execute("SELECT * FROM mytable") row = cursor.fetchone() while row: print(row) row = cursor.fetchone() # 关闭连接 cnxn.close() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值