达梦数据库基础---表
表是数据库中数据存储的基本单元,是对用户数据进行读和操纵的逻辑实体。表由列和行组成,每一行代表一个单独的记录。表中包含一组固定的列,表中的列描述该表所跟踪的实体的属性,每个列都有一个名字及各自的特性。
列的特性由两部分组成:数据类型(dataType)和长度(length)。对于 NUMERIC、DECIMAL 以及那些包含秒的时间间隔类型来说,可以指定列的小数位及精度特性。在DM 系统中,CHAR、CHARACTER、VARCHAR 数据类型的最大长度由数据库页面大小决定,数据库页面大小在初始化数据库时指定。DM 系统具有 SQL-92 的绝大部分数据类型,以及部分SQL-99、Oracle 和 SQL Server 的数据类型。
为了确保数据库中数据的一致性和完整性,在创建表时可以定义表的实体完整性、域完整性和参考完整性。实体完整性定义表中的所有行能唯一地标识,一般用主键、唯一索引、UNIQUE 关键字及 IDENTITY 属性来定义;域完整性通常指数据的有效性,限制数据类型、缺省值、规则、约束、是否可以为空等条件,域完整性可以确保不会输入无效的值;参考完整性维护表间数据的有效性、完整性,通常通过建立外键联系另一表的主键来实现。
如果用户在创建表时没有定义表的完整性和一致性约束条件,那么用户可以利用 DM 所提供的基表修改语句来进行补充或修改。DM 系统提供基表修改语句,可对基表的结构进行全面的修改,包括修改基表名、列名、增加列、删除列、修改列类型、增加表级约束、除表级约束、设置列缺省值、设置触发器状态等一系列修改功能。
1.管理表的准则
1.1 设计表
表是数据库设计过程中的基本构件,基于来自应用开发者的有关应用如何运作和所期望的数据类型,数据库管理员应与应用开发者一起工作,并认真规划每个表,具体需要做到以下几点:
- 规范化表,估算并校正表结构,使数据冗余达到最小;
- 为每个列选择合适的数据类型,是否允许为空等,并根据实际情况判断是否需要对列进行加密或压缩处理;
- 建立合适的完整性约束。
- 建立合适的聚集索引。每个表(列存储表,堆表除外)都含一个聚集索引,默认以ROWID 建立,而建立合适的聚集索引,可以有效加快表的检索效率;
- 根据实际需要,建立合适类型的表。DM 支持的表类型包括普通表、临时表、水平分区表、垂直分区表、堆表和列存储表。
1.2 指定表的存储空间上限
在创建表时指定 SPACE LIMIT 子句,可以对表的存储空间指定上限。DM 支持对表的存储空间指定大小,单位是 MB,即表的大小可由管理员指定,便于表的规模管理。当表的所有索引所占用的存储空间超过指定大小时,表将不能再新增数据。
1.3 指定表的存储位置
创建表时,在 STORAGE 子句中,可对表指定存储的表空间。如果没有指定,则该表将创建在用户的默认表空间中。在创建表时,通过指定合适的表空间,有以下优点:
- 提高数据库系统的性能,因为不同的数据库表可能对应不同的数据文件,可减少对相同文件的竞争;
- 减少数据库管理的时间,数据库表分布在不同的表空间中,即使一个表空间损坏,也不影响其他表空间上数据库表的正常访问。
2 创建表
2.1 普通表示例
如果要在所属模式中创建新表,需要有 CREATE TABLE 数据库权限;而要在其他用户的模式中创建新表,则需要有 CREATE ANY TABLE 数据库权限。创建表时,应当为表指定一个表空间,否则,表将在 MAIN 创建。下面给出一个创建一个简单表的例子。
例1:
CREATE TABLE EMPLOYEE (
EMPNO INT PRIMARY KEY,
ENAME VARCHAR(15) NOT NULL,
JOB VARCHAR(10),
MGR INT
CONSTRAINT EMP_FKEY REFERENCES EMPLOYEE(EMPNO),
HIREDATE DATE DEFAULT (CURDATE),
SALARY FLOAT,
DEPTNO TINYINT NOT NULL
CONSTRAINT DEPT_FKEY REFERENCES DEPT(DEPTNO))
STORAGE (
INITIAL 50,
NEXT 50,
MINEXTENTS 10,
FILLFACTOR 80,
ON USERS);
例2:
CREATE TABLE PRODUCTION.PRODUCT_REVIEW
(
PRODUCT_REVIEWID INT IDENTITY(1,1),
PRODUCTID INT NOT NULL,
NAME VARCHAR(50) NOT NULL,
REVIEWDATE DATE NOT NULL,
EMAIL VARCHAR(50) NOT NULL,
RATING INT NOT NULL,
COMMENTS TEXT,
PRIMARY KEY(PRODUCT_REVIEWID),
FOREIGN KEY(PRODUCTID) REFERENCES PRODUCTION.PRODUCT(PRODUCTID),
CHECK(RATING IN(1,2,3,4,5))
);