8-表的定义
表的定义
数据库中分很多种表,如普通表、簇表、分区表、外部表、临时表等
表可以类似的理解为excel表格,有行,有列,同时也可以进行查询
下面将会介绍普通表的创建、修改、删除,还有字段的数据类型等内容
表的基本概念
1、在KES中,表又被称为关系。与现实相关的一个关系对象,如员工表、部门表
2、表是由行和列组成的二维对象
3、表中的字段是用数据类型来决定的,必须为每个列指定数据类型
创建普通表
1、创建表的时候,需要指定表名、列名、列的数据类型、列数据精度、列的缺省值、表的约束等
语法:
CREATE [ UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type } [ COLLATE collation ] [ column_constraint [ ... ] ] ]
| table_constraint
| LIKE source_table [ like_option ]
[, ...] ])
[ WITH ( storage_parameter [= value] ) [,...] | WITH OIDS | WITHOUT OIDS ]
[ TABLESAPCE tablespace_name ]
参数名称 | 简介 |
---|---|
TEMPORARY | TEMP | 表示该表是临时表 |
UNLOGGED | 指定该表在修改时不会在WAL日志中保存事务日志 |
INHERITS | 创建分区表时会使用,在子表和它的父表之间创建一种持久的关系 |
WITH | 创建表时指定参数,例如:FILLFACTOR、OIDS等 |
ON COMMIT | 指定临时表在一个事务结束的行为 |
TABLESPACE | 创建表时指定表所存放的表空间 |
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[, <列名> <数据类型>[ <列级完整性约束条件> ] ]
[,<表级完整级约束条件>] )
<表名>:索要定义的基本表的名字
<列名>:组成该表的各个属性(列)
<列级完整性约束>:涉及一个或多个属性列的完整性约束条件,用来唯一标识该行记录
<表级完整性约束>:涉及一个或多个属性列的完整性约束条件
修改表
1、使用ALTER TABLE命令可以修改表名、列名、列的精度、列的默认值,维护约束,更改表空间等
当表中存在记录的时候,修改时要符合现有数据的要求,否则可能修改失败或者导致数据被截断
语法:
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [,...]
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME [ COLUMN ] coulmn_name to new_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER TABLE [ IF EXISTS ] name RENAME TO new_name
ALTER TABLE [ IF EXISTS ] name SET SCHEMA new_schema
ALTER TABLE ALL IN TABLESAPCE name [ OWNED BY role_name [,...] ] SET TABLESPACE new_tablespace [NOTICE]
参数 | 简介 |
---|---|
ADD COLUMN | 新增一个列,新列将被默认值所填充,如果没有指定DEAFAULT子句,则会填充空值 |
DROP COLUMN | 删除一个列,列中的数据将会消失,涉及到该列的约束也会被移除 |
ADD CONSTRAINT | 新增一个约束,与表约束的语法相同 |
DROP CONSTRAINT | 删除一个约束,可以用"\d 表名"方式获取约束的名称 |
SET TABLESPACE | 移动表到其他的表空间 |
OWNER TO | 修改表的拥有者 |
删除表
1、DROP TABLE命令会将表的定义、表的依赖对象、表的数据同时从数据库中删除
2、只有表的拥有者、模式拥有者和超级用户能对表执行删除操作
3、RESTRICT关键字表示如果还有对象依赖于表,例如外键约束等,则不能删除表,这是默认选项
4、要删除一个被外键约束的表,需要指定CASCADE关键字(只级联删除外键约束,而不会删除原外键表中的数据行)
DROP TABLE [ IF EXISTS ] name [,...] [ CASCADE | RESTRICT ]
参数 | 简介 |
---|---|
RESTRICT | 当有外键约束时删除主表会失败 |
CASCADE | 当有外键约束时删除主表会连同子表中的数据一起删除 |
截断表
1、TRUNCATE TABLE命令会清空表中的数据,保留表的定义,立即回收表占用的磁盘空间
2、KES在执行TRUNCATE TABLE时会是一个能快速清空资料表内所有的资料的SQL语法。TRUNCATE语句的执行效率要高于delete语句
语法:
TRUNCATE [ TABLE ] [ ONLY ] neme [ * ] [,...] [ RESTART IDENTITY | CONTITY IDEBTITY ] [ CASCADE | RESTRICT ]
参数 | 简介 |
---|---|
RESTART IDENTITY | 自动重新开始截断表的序列 |
CONTINUE IDENTITY | 默认不该序列值 |
RESTRICT | 默认,表有外键引用则阻止记录被清空 |
CASCADE | 存在主外键关联时,清空父表时子表关联的行被级联清空 |
实验1:创建表
执行实验所需环境
test=# \i /install/EXAM_v0.11.sql
使用常规语法创建表
1、创建t01表
①表包含id、name、location三个列,类型分别为serial、text、text
②表存储在sys_default表空间(即默认表空间)
③使用"\d"命令查看t01表的定义信息
test=# create table public.t01(id serial,name text,location text);
CREATE TABLE
test=# \d t01
数据表 "public.t01"
栏位 | 类型 | 校对规则 | 可空的 | 预设
----------+---------+----------+----------+---------------------------------
id | integer | | not null | nextval('t01_id_seq'::regclass)
name | text | | |
location | text | | |
2、创建t02表
①表包含code、title、did、date_prod、kind、len字段,类型分别为char(5)、varchar(40)、integer、date、varchar(10)、interval hour to minute,其中title和did字段不允许为空
②表存储在sys_default表空间(即默认表空间)
③使用"\d"命令查看t02表的定义信息
test=# create table t02(code char(5),title varchar(40) NOT NULL,did integer NOT NULL,date_prod date,kind varchar(10),len interval hour to minute);
CREATE TABLE
test=# \d t02
数据表 "public.t02"
栏位 | 类型 | 校对规则 | 可空的 | 预设
-----------+----------------------------+----------+----------+------
code | character(5 char) | | |
title | character varying(40 char) | | not null |
did | integer | | not null |
date_prod | date | | |
kind | character varying(10 char) | | |
len | interval hour(2) to minute | | |
通过子查询来创建表
1、通过复制exam模式下的student表来创建student_m表,值复制原表中部分数据到新表中
注:使用子查询创建表时会复制表的字段名和表数据等信息到新表中
test=# create table student_m as select * from exam.student where gender='m';
SELECT 6
gender='m'表示复制性别为男的数据
2、通过复制exam模式下course表来创建course01表,复制原表中全部数据到新表中
test=# create table course01 as select * from exam.course;
SELECT 3
使用LIKE语法来创建表
1、使用LIKE创建表,非空约束会默认复制到新表中
①例如:根据t02表新建t03表,并查看t03表的信息
test=# create table t03 (like t02 including defaults including constraints including indexes);
CREATE TABLE
注:1、使用like复制的时候,并不会复制原表的数据到新表中
2、including defaults:表示复制t02表中默认值;3、including constraints:表示复制t02表中的约束(如主键、外键、唯一性约束等)
4、including indexes:表示复制t02表中的索引
实验2:修改表
重命名表名、列名、约束名
修改表名时,使用rename to;修改列名时,使用rename old_column_name to new_column_name
修改约束名时,使用rename constraint old_constraint_name to new_constraint_name
1、修改course01表的名字为courseOLD
test=# alter table course01 rename to courseOLD;
ALTER TABLE
2、修改courseOLD表的cname列的名字为cno_name
test=# alter table courseold rename cname to cno_name;
ALTER TABLE
3、修改exam.score表的外键约束cno_fk的名字为course_con_fk
test=# alter table exam.score rename CONSTRAINT cno_fk to course_con_fk;
ALTER TABLE
修改表的模式(schema)
移动表时,会将表拥有的索引、约束和序列到;另一个模式下,必须由该表的拥有者或者超级用户执行,同时执行者必须拥有新模式上的CREATE特权
1、移动exam.score表到新建的sch01模式下
test=# alter table exam.score set schema sch01;
ALTER TABLE
移动表到其它空间
1、新建表空间tbs01和tbs02
①创建表空间所使用的目录并设置目录的属主、属组和文件系统权限
[root@node1 ~]# mkdir /tbs01
[root@node1 ~]# mkdir /tbs02
[root@node1 ~]# chown kingbase.kingbase /tbs01
[root@node1 ~]# chown kingbase.kingbase /tbs02
②创建两个表空间分别指向对应的目录
test=# create tablespace tbs01 location '/tbs01';
CREATE TABLESPACE
test=# create tablespace tbs02 location '/tbs02';
CREATE TABLESPACE
2、查看待移动表的原始表空间,然后迁移表到表空间tbs01中
test=# select table_name,tablespace_name from dba_tables where table_name in ('COURSE','STUDENT');
table_name | tablespace_name
------------+-----------------------------
COURSE | database default tablespace
STUDENT | database default tablespace
(2 行记录)
test=# ALTER table exam.course set tablespace tbs01;
ALTER TABLE
test=# alter table exam.student set tablespace tbs01;
ALTER TABLE
test=# select table_name,tablespace_name from dba_tables where table_name in ('COURSE','STUDENT');
table_name | tablespace_name
------------+-----------------
COURSE | tbs01
STUDENT | tbs01
(2 行记录)
3、将tbs01表空间中的所有表全部迁移到表空间tbs02
test=# alter table all in tablespace tbs01 set tablespace tbs02;
ALTER TABLE
test=# select table_name,tablespace_name from dba_tables where table_name in ('COURSE','STUDENT');
table_name | tablespace_name
------------+-----------------
COURSE | tbs02
STUDENT | tbs02
(2 行记录)
修改表的其它定义
增加、删除、修改表中的列(字段)
1、在表t02中增加列address,类型为varchar,精度为30
test=# alter table t02 add column address varchar(30);
ALTER TABLE
2、删除表t02中的address字段
test=# alter table t02 drop column address;
ALTER TABLE
3、修改表t02的部分字段类型,将did的类型修改为number(10,2),将kind的类型修改为varchar(20)
test=# alter table t02 alter COLUMN did type number(10,2);
ALTER TABLE
test=# alter table t02 alter COLUMN kind type varchar(20);
ALTER TABLE
实验3:截断表
1、使用TRUNCATE命令清空courseold表中数据
test=# truncate courseold;
TRUNCATE TABLE
实验4:临时表
1、概述:默认情况下,创建的临时表为会话级临时表,即只能在创建临时表的会话中使用,表结构在整个会话周期中一直保留。而在不同会话中可以创建同名的临时表
2、可以使用ON COMMIT PRESERVE ROWS(默认,事务结束时保留临时表记录)
或者ON COMMIT DELETE ROWS(事务结束时清除临时表记录)关键字指定事务结束后临时表数据是否被清除
3、在创建临时表的时候,系统会自动为其分配一个模式(SYS_TEMP_xx),不能再创建临时表时指定模式
示例:先在当前会话创建临时表,接着在换一个会话查看是否还有在刚刚那个会话中创建的临时表
test=# create temporary table temp01(id int) on commit preserve rows;
CREATE TABLE
test=# create temporary table temp02(id int) on commit delete rows;
CREATE TABLE
事务级临时表
1、使用ON COMMIT DROP 关键字创建事务级临时表,表的创建和使用需要放在同一个事务中,事务结束后表结构和表中数据都会被删除
就是说,事务结束后,表就消失的。表的存在是依托于事务的。但如果当前会话退出后,事务级临时表还是会被删除
示例:开启事务,创建事务级临时表后,结束事务,并查看刚刚创建的事务级临时表是否还存在
test=# begin ;
BEGIN
test=# create temporary table temp03 (id int) on commit drop ;
CREATE TABLE
test=# \dt temp03
关联列表
架构模式 | 名称 | 类型 | 拥有者
-----------+--------+--------+--------
pg_temp_4 | temp03 | 数据表 | system
(1 行记录)
test=# end;
COMMIT
test=# \dt temp03
没有找到任何名称为 "temp03" 的关联.
数据类型补充说明
类型 | 长度 | 变长/定长 | 取值范围 |
---|---|---|---|
int | 4字节 | 常用的整数 | -2147483648到+2147483647 |
serial | 4字节 | 自增型 | 1到+2147483647 |
numeric或number | 变长 | 用户自定义精度 | 无限制,与decimal等效 |
decimal | 变长 | 用户自定义精度 | 无限制,与numeric或number等效 |
char(n) | 自定义 | 定长,不足不补空白 | 用户定义固定长度的字符串。n为精度,单位为byte或char,默认为char |
varchar(n) | 自定义 | 变长,用户定义 | 用户定义不定长度的字符串 |
test | 不固定 | 变长,无长度限制 | 用户定义未知长度的打文本 |
date | 4字节 | 日期 | 精度到天 |
time | 8字节 | 时间 | 精度到毫秒 |
timestamp | 8字节 | 包括日期和时间 | 精度毫秒,1纳秒/17位 |
interval | 12字节 | 时间间隔 | 精度毫秒 |
BYTEA | 4字节+ | 二进制数据 | 用于存储图片等二进制数据 |
numeric(4,0):表示精度为4,标度为0,精度为数值可以拥有的总位数,标度为小数点后的位数,也就是说"numeric(4,0)"可以存储的数值最多可以有4位数字,如1001,1002…,标度位0,代表数值不能有小数部分,只能存储整数