暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 创建表

墨天轮 2019-10-12
805

创建表

前提条件

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

相关概念

创建表时使用表名(如,staffs)和一组列定义表。每个列有两个属性,列名和数据类型(如,列名STAFF_ID,指定数据类型为NUMBER(6);列名FIRST_NAME,数据类型为VARCHAR(20 BYTE)。每一列可以指定完整性约束(NOT NULL),以保证这一列的每行中必须包含一个值。

创建表之后,可以使用INSERT命令插入数据或使用数据导入导出工具装载数据,还可以直接使用CREATE TABLE AS query创建一个包含数据的表。

  • 表的列和相关的数据类型。

    列的数据类型决定该列包含数据值的类型。选择使用尽可能少的空间,仍能保存用户数据的数据类型。比如:使用varchar类型存储字符串,使用date或者timestamp类习惯存储日期,使用numeric类型存储数字。当使用空格填充类型的时候,增加容量使用CHAR、VARCHAR和TEXT数据类型没有性能差异。在大多数情况下使用TEXT或VARCHAR优于CHAR。

    如果要连接两个表,则连接的那一列需要有相同的数据类型。表的连接通常是一个表的主键和另一个表的外键。如果数据类型不同,数据库必须将其中的一个进行转化,则会导致数据值需要比较正确性,引起不必要的开销。

  • 表和列的约束。如果定义表和列的约束条件,则表和列中包含的数据就会受到限制。
    • [ NOT ] NULL

      是否允许该列值为空。

    • UNIQUE

      值唯一,允许为空,一个表可以多个列为UNIQUE。

    • PRIMARY KEY

      主键,设为主键的列不能为空,一个表只能建立一个主键。

普通表

在表空间human_resource中创建表staffs,其中STAFF_ID列不能为空。

CREATE TABLE hr.staffs ( staff_id NUMBER(6) NOT NULL, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone_number VARCHAR2(20), hire_date DATE, employment_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), section_id NUMBER(4), graduated_name VARCHAR2(60) ) TABLESPACE human_resource;

临时表

GaussDB 100支持创建临时表。在处理复杂查询时,临时表用来保存一个会话或者一个事务中需要的数据。当会话退出或者用户提交和回滚事务的时候,临时表的数据自动清空,但表结构仍然存在。临时表分为会话级临时表和事务级临时表,如果创建临时表时不指定ON COMMIT { DELETE | PRESERVE } ROWS子句,默认创建事务级别临时表。

全局临时表支持创建临时索引,更新、插入和删除数据。索引中的数据与基础表中的数据具有相同的会话或事务范围。本地临时表,只支持ON COMMIT PRESERVE ROWS,表名必须以‘#’字符开头,并且设置配置项LOCAL_TEMPORARY_TABLE_ENABLED=TRUE,LOCAL_TEMPORARY_TABLE_ENABLED设置是否激活本地临时表特性。

  • 会话级临时表,ON COMMIT PRESERVE ROWS

    临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,自动清除临时表中数据。 表执行TRUNCATE语句清空临时表数据,但不会清空其它会话临时表中的数据。

    创建会话级全局临时表staff_history_session。

    CREATE GLOBAL TEMPORARY TABLE staff_history_session (startdate DATE, enddate DATE ) ON COMMIT PRESERVE ROWS;
  • 事务级临时表,ON COMMIT DELETE ROWS

    临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),自动清除临时表中数据。

    创建事务级全局临时表staff_history_session。

    CREATE GLOBAL TEMPORARY TABLE staff_history_session (startdate DATE, enddate DATE ) ON COMMIT DELETE ROWS;

NOLOGGING表

NOLOGGING表不记录Redo日志,日志量减少可以提高性能。但是由于没有Redo日志,数据库重启后无法重演恢复(Recover),表定义保留但是数据清空。对可靠性要求不高的非核心数据,可以使用NOLOGGING表保存。NOLOGGING表的表空间必须且仅能为NOLOGGING表空间,如果不指定则默认在TEMP2表空间。

NOLOGGING表支持以下功能:
  • 表定义支持主备复制,表数据不做主备复制。
  • 表定义支持备份恢复,表数据不做备份。
  • 支持MVCC,支持ROLLBACK,支持普通表所支持的DDL和DML操作。

NOLOGGING表可以通过指定NOLOGGING关键字,或者指定放在NOLOGGING表空间上创建。

  • 指定NOLOGGING关键字,创建表staffs_nologging。
    CREATE TABLE staffs_nologging ( staff_id NUMBER(6) NOT NULL, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone_number VARCHAR2(20), hire_date DATE, employment_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), section_id NUMBER(4), graduated_name VARCHAR2(60) )NOLOGGING;
  • 指定在表空间TEMP2上创建NOLOGGING表staffs_temp2。
    CREATE TABLE staffs_temp2( staff_id NUMBER(6) NOT NULL, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone_number VARCHAR2(20), hire_date DATE, employment_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), section_id NUMBER(4), graduated_name VARCHAR2(60) ) TABLESPACE temp2;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论