



表是数据库中数据存储的基本单元,是用户对数据进行读和操纵的逻辑实体。表由列和行组成,每一行都代表一个单独的记录;表中包含一组固定的列,表中的列描述该表所跟踪实体的属性,每一列都有一个名称并有其特性。列的特性由两部分组成:数据类型和长度。对于NUMERIC、DECIMAL及包含秒的时间间隔类型来说,可以指定列的小数位及精度特性。在达梦数据库中,CHAR、CHARACTER、VARCHAR数据类型的最大长度由数据库页面的大小决定,数据库页面大小在初始化数据库时指定。
为了确保数据库中数据的一致性和完整性,在创建表时可以定义表的实体完整性、域完整性和参照完整性。实体完整性定义表中的所有行能唯一地标识,一般用主键、唯一索引、UNIQUE关键字、IDENTITY属性来定义;域完整性通常指数据的有效性,限制数据类型、默认值、规则、约束、是否可以为空等条件,域完整性可以确保不会输入无效的值;参照完整性维护表间数据的有效性、完整性,通常通过建立外键对应另一个表的主键来实现。
如果用户在创建表时没有定义表的完整性和一致性约束条件,用户可以利用达梦数据库提供的表修改语句或工具来进行补充或修改。达梦数据库提供的表修改语句或工具可对表的结构进行全面的修改,包括修改表名和列名、增加字段、删除字段、修改字段类型、增加表级约束、删除表级约束、设置字段默认值、设置触发器状态等一系列修改功能。
在达梦数据库中,表可以分为两类,数据库表和外部表。数据库表由数据库管理系统自行组织管理;外部表在数据库的外部组织,是操作系统文件。这里只介绍数据库表的创建、修改和删除操作。
在达梦数据库中,数据库表用于存储数据对象,分为一般数据库表(简称数据库表)和高性能数据库表。
【 例2-12 】在DMHR模式下创建DEPT表,表的字段要求如表2-3所示。
表2-3 DEPT表的字段要求
步骤1:启动DM管理工具,使用具有DBA角色的用户连接数据库,如SYSDBA用户。在登录数据库成功后,右键单击对象导航窗体中DMHR模式下的“表”,弹出如图3-16所示的新建表快捷菜单。
图2-16 新建表快捷菜单
步骤2:在弹出的新建表快捷菜单中单击“新建表”选项,弹出“新建表”对话框,如图2-17所示。
图2-17 “新建表”对话框
步骤3:在如图2-17所示的对话框中,进入常规参数页面,设置表名为“DEPT”,设置注释为“部门表”。
单击“+”按钮,增加一个字段,选中“主键”,“列名”为DEPTID,“数据类型”选择NUMBER,默认非空,“精度”为2,“标度”为0。
单击“+”按钮,增加一个字段,“列名”为DEPTNAME,“数据类型”选择VARCHAR,选中非空,“精度”为20,“标度”为0。在列属性中,“值唯一”选择“是”。
单击“+”按钮,增加一个字段,“列名”为DEPTLOC,“数据类型”为VARCHAR,“精度”为128,“标度”为0。
步骤4:字段设置完成后,单击“确定”按钮,完成DEPT表的创建。
1)语法格式
表结构的完整语法格式篇幅很长,为了便于读者学习,这里做一些必要的简化。创建数据库表的SQL命令格式如下:
各子句简化说明如下:
表结构定义的核心是字段名和字段类型,还包括字段约束和表约束等,初学者掌握这几项即可。达梦数据库表还包括分区表、HFS表、LIST表等,在创建这些高性能数据库表时,还需要指定专门的关键词和子句。
2)应用举例
【 例2-13 】在DMHR2模式下创建REGION表、CITY表和LOCATION表,表的字段要求如附录A中的示例数据库所示。
(1)设置DMHR用户的当前模式为DMHR2。
(2)创建REGION表。
(3)创建CITY表。
(4)创建LOCATION表。
(1)表至少要包含一个字段,在一个表中,各字段名不能相同;另外,一张表中最多可以包含2048个字段。
(2)如果字段类型为DATE,在指定默认值时,格式如DEFAULT DATE'2005-13-26',则会对数据进行有效性检查。
(3)如果字段未指明NOT NULL,也未指明<DEFAULT子句>,则隐含为DEFAULT NULL。
(4)如果完整性约束只涉及当前正在定义的列,则既可定义成列级完整性约束,也可定义成表级完整性约束;如果完整性约束涉及该表的多个列,则只能在语句的后面定义成表级完整性约束。在定义与该表有关的列级完整性约束或表级完整性约束时,可以用CONSTRAINT<约束名>子句对约束命名,系统中相同模式下的约束名不得重复。如果不指定约束名,则系统将为此约束自动命名。经定义后的完整性约束被存入系统的数据字典中,用户在操作数据库时,由DBMS自动检查该操作是否违背这些完整性约束条件。
为了满足用户在建立应用系统过程中需要调整数据库结构的要求,达梦数据库系统提供了数据库表修改语句和工具,包括修改表名、修改字段名、增加字段、删除字段、修改字段类型、增加表级约束、删除表级约束、设置字段默认值、设置触发器状态等操作,可对表的结构进行全面修改。
【 例2-14 】删除和添加字段。以用户SYSDBA登录,删除DMHR模式下的DEPT表中的DEPTLOC字段,并添加一个DEPTMANAGERID字段,该字段数据类型为INT,长度为10。
步骤1:启动DM管理工具,以用户SYSDBA登录。登录数据库成功后,右键单击对象导航窗体中DMHR模式下的DEPT表,弹出如图2-18所示的快捷菜单。
图2-18 “修改”快捷菜单
步骤2:在如图2-18所示的菜单中,单击“修改”选项,进入如图2-19所示的“修改表”对话框。
步骤3:在如图2-19所示的对话框中,选中DEPTLOC字段信息,并单击“-”按钮,删除该字段;单击“+”按钮,增加一个名为DEPTMANAGERID的字段,并设置该字段类型为INT,精度为10,如图2-20所示。
图2-19 “修改表”对话框
图2-20 “修改表”操作完成
步骤4:修改完成后,单击“确定”按钮,即可完成表的修改操作。
1)语法格式
修改数据库表的SQL命令格式如下:
其中,<修改表定义子句>的简化格式如下:
2)注意事项
(1)在使用MODIFY COLUMN时,不能更改聚集索引的列,或者引用约束中引用和被引用的列。
(2)在使用MODIFY COLUMN时,一般不能更改用于CHECK约束的列。只有当该CHECK约束的列都为字符串,并且新列的长度大于旧列的长度;或者新列和旧列都为整型,并且新列类型能够完全覆盖旧列类型(如char(1)到char(20),tinyint到int等)时,才能修改。
(3)在使用MODIFY COLUMN时,不能在列上增加CHECK约束,能修改的约束只有列上的NULL、NOT NULL约束;如果某列现有的值均非空,则允许添加NOT NULL;属于聚集索引包含的列不能被修改;自增列不允许被修改。
(4)在使用ADD COLUMN时,新增列名之间、新增列名与该基表中的其他列名之间均不能重复。若新增列有默认值,则已存在行的新增列值是其默认值。添加新列对于任何涉及表的约束定义没有影响,对于涉及表的视图定义会自动增加。例如,如果用“*”为一个表创建一个视图,那么后加入的新列会自动地加入该视图。
(5)用DROP COLUMN子句删除列有两种方式:RESTRICT和CASCADE。RESTRICT方式为默认选项,确保只有不被其他对象引用的列才能被删除。无论哪种方式,表中的唯一列不能被删除。
3)应用举例
【 例2-15 】修改数据表结构举例。本例需要设置DMHR用户的当前模式为DMHR。
(1)修改字段类型长度。将EMPLOYEE表的EMAIL字段的数据类型改为VARCHAR(60),并指定该列为NOT NULL。
(2)增加普通字段。在EMPLOYEE表中增加HOME_ADDRESS字段,字段类型为VARCHAR(200)。
(3)增加CHECK约束。为EMPLOYEE表增加CHECK约束,名称为SALARY_CHECK,要求SALARY字段的值大于1000。
(4)删除约束。删除EMPLOYEE表的SALARY_CHECK约束。
(5)删除字段。删除EMPLOYEE表的HOME_ADDRESS字段。
(1)当对列进行修改且可更改列的数据类型时,若表中无元组,则系统可任意修改其数据类型、长度、精度或量度;若表中有元组,则系统会尝试修改其数据类型、长度、精度或量度,如果修改不成功,则会报错返回。无论表中是否有元组,多媒体数据类型和非多媒体数据类型都不能相互转换。
(2)在修改有默认值的列的数据类型时,原数据类型与新数据类型必须是可以转换的,否则即使数据类型修改成功,在进行插入等其他操作时,仍会出现数据类型转换错误。
(3)在增加列时,新增列名之间、新增列名与该基表中的其他列名之间均不能重复。若新增列有默认值,则已存在的行的新增列值是其默认值。
(4)具有DBA权限的用户或该表的建立者才能执行修改操作。
删除数据库表会导致该表的数据及对该表的约束依赖被删除,因此在业务工作中很少有删除数据库表的操作。但是,作为数据库管理员,掌握删除数据库表的方法是非常必要的。
删除数据库表可以采用SQL语句或DM管理工具来实现,此处使用DM管理工具来删除数据表。
【 例2-16 】以用户SYSDBA登录,删除DMHR模式下的DEPT表。
使用DM管理工具删除表很简单,具体操作步骤如下。
步骤1:启动DM管理工具,以用户SYSDBA登录。登录数据库成功后,右键单击对象导航窗体中DMHR模式下的DEPT表,弹出如图2-18所示快捷菜单。
步骤2:在如图2-18所示的快捷菜单中,单击“删除”选项,弹出如图2-21所示的“删除对象”对话框。
图2-21 “删除对象”对话框
步骤3:在如图2-21所示的“删除对象”对话框中,单击“确定”按钮,即可删除该表。
1)语法格式
删除数据库表的SQL命令如下:
删除表有两种方式:RESTRICT方式和CASCADE方式,其中RESTRICT方式为默认值。如果以RESTRICT方式删除数据库表,要求该表上不存在任何视图及参照完整性约束,否则达梦数据库返回错误信息,无法删除该表。如果以CASCADE方式删除数据库表,将删除表中唯一列上和主关键字上的参照完整性约束,当设置dm.ini配置文件中的参数DROP_CASCADE_VIEW的值为1时,还可以删除所有建立在该表上的视图。
2)应用举例
【 例2-17 】删除DMHR2模式下的CITY表。
因为CITY表中的字段CITY_ID作为LOCATION表中的一个外键,所以需要使用CASCADE方式。
(1)在删除主从表时,应先删除从表,再删除主表。
(2)表删除后,在该表上建立的索引也同时被删除。
(3)表删除后,所有用户在该表上的权限也自动取消,以后系统中再创建的与该表同名的基表,与该表毫无关系。