数据库版本:KingbaseES V008R006C008B0014
简介
本篇文章主要以kingbase为例介绍创建表的基本语法、使用案例和添加描述等方法,在目录2、目录3再详细介绍数据类型和列级约束。
文章目录如下
1. 基本用法
1.1. 基础语法
CREATE 语句用于在数据库中创建各种对象,比如创建库、模式、表、索引和视图等。
本篇文章主要介绍创建表的用法,基础语法如下:
/*方括号表示可选*/
CREATE TABLE 表名(
列名1 数据类型1 [列级约束1] ,
列名2 数据类型2 [列级约束2]
......
[表级约束(主键、外键、唯一等)]
);
- 数据类型:定义该列可以存储的数据的类型(例如:字符、数字等)。
- 列级约束:定义该列的规则(例如:唯一、非空等)。
- 表级约束:应用于整个表或多个列之间的规则(例如:外键、检查等)。
1.2. 基础案例
数据库中的表就类似于excel中的表,用于存储信息。例如excel表格信息:
这张表的作用是记录每个人的身份信息,总共2列数据:
- 第1列姓名:数据类型为字符,名字长度一般不超过64位
- 第2列身份证号可能存在字母,也属于字符类,长度为18位且唯一
根据表的作用和存储的数据,在创建表时定义对应的规则:
CREATE TABLE 表名(
/* 列名 数据类型 列级约束 */
姓名 text not null, --类型为字符,不能为空
身份证号 char(18) unique --长度为18位,且唯一
);
- 数据类型text和列级约束not null对于新手来说有点抽象,那么就从英语翻译来看(text表示文本,not null 表示不能为空)。这些在目录2、目录3都有详细介绍,案例这里只需要能看懂就行。
而小李、小王是属于表中的数据,则需要使用INSERT将其插入进去:
INSERT INTO
表名
VALUES
('小李', '320524199012305678'),
('小王', '14082919870523210X');
结果如下:
理解了如何创建一张简单表,那么再来看看这张复杂点的表:
上述举了一个员工信息的表格,将该信息转换到数据库同样需要2步。
1、创建表格:
CREATE TABLE 员工信息表(
/* 列名 数据类型 列级约束 */
工号 int primary key, --整数类型,主键唯一约束
姓名 varchar(128) not null, --字符类型,不能为空
性别 varchar(2) default '男', --字符类型,默认'男'
年龄 int not null, --整数类型,不能为空
学历 varchar(32) not null, --字符类型,不能为空
薪资 decimal(10,2) not null, --定点数类型,不能为空
入职日期 date default now() --日期类型,默认当前日期
);
我们将其创建到数据库中,得到如下信息:
2、将数据添加到表中:
INSERT INTO
员工信息表
VALUES
(1, '张三', '男', 25, '本科', 8000, '2000-01-01'),
(2, '小兰', '女', 19, '硕士', 11000, '2000-01-02'),
(3, '李四', '男', 29, '初中', 5000, '2000-01-03');
向表中添加信息后,就能根据每列的列名清晰的了解到每个员工的信息。
注意:以上只是举例,在实际应用过程中尽量不使用中文,否则可能乱码
1.3. 添加描述
在一个系统中会存在成千上万张表,某些表名或列名可能类似,在这种情况下就需要对该表或列添加描述。
1、对表添加描述:
--如果该表不存在描述则添加,如果存在则修改
COMMENT ON TABLE 表名 IS '描述信息';
查看该表的描述:
SELECT
description
FROM
sys_description
WHERE
objsubid = 0
AND
objoid = '表名'::regclass;
2、对列添加描述:
--如果该列不存在描述则添加,如果存在则修改
COMMENT ON COLUMN 表名.列名 IS '描述信息';
3、删除描述
--删除表的描述
COMMENT ON TABLE 表名 IS NULL;
--删除列的描述
COMMENT ON COLUMN 表名.列名 IS NULL;
2. 数据类型
数据类型是用来定义列(字段)存储数据的属性的规则。比如某张表的某列是ID,则应该定义为整数类型:
CREATE TABLE t1(id int); --定义id列为整数类型
定义为整数类型后就只能插入整数
如果向该类型的列插入字符则是违反规则的,无法插入
下面介绍几种常用的数据类型方法
2.1. 字符类型
字符类型用于存储文本数据,比如插入字符 'abc',则需要在创建表时指定该列约束为字符类型。
--创建表,指定某列为字符类型
CREATE TABLE 表名(列名 字符类型);
--插入数据必须为字符型,使用引号
INSERT INTO 表名 VALUES('字符');
- 注意:插入数据时只要使用引号则会被认定为字符,比如 '100',使用引号后100会被认定为字符类型
1、固定长度char(默认1,最大10485760)。如果插入的字符没有达到指定长度,则自动使用空格填充。语法如下:
char(n char) --指定字符长度
char(n byte) --指定字节长度
案例如下:
CREATE TABLE 表名(列名 char(2)); --指定2个字符
CREATE TABLE 表名(列名 char(2 char)); --指定2个字符
CREATE TABLE 表名(列名 char(2 byte)); --指定2个字节
无法插入超过长度的数据(无法插入)
2、可变长字符varchar(默认1,最大10485760)。只存储实际的字符串数据,不会自动填充空格。语法如下:
varchar(n char) --指定字符长度
varchar(n byte) --指定字节长度
案例如下:
CREATE TABLE 表名(列名 varchar(2)); --指定2个字符
CREATE TABLE 表名(列名 varchar(2 char)); --指定2个字符
CREATE TABLE 表名(列名 varchar(2 byte)); --指定2个字节
char和varchar的区别就是:char自动填充空格,varchar不会自动填充空格
- char自动填充后,该表的数据会更大。所以在没有特殊情况下尽量不使用char,使用不当会造成大量空间浪费。
3、大数据字符text(最大存储1G)。无限变长,存储任何长度的字符串
CREATE TABLE 表名(列名 text); --不需要指定长度
2.2. 数值类型
数值类型是用于存储数字,主要定义数字在数据库中的表示形式和可存储的范围
--创建表,指定某列为数值类型
CREATE TABLE 表名(列名 数值类型);
--插入数据必须为数值型
INSERT INTO 表名 VALUES(100);
1、经典整型int或integer(范围:-2147483648 到 2147483647)
CREATE TABLE 表名(列名 int);
CREATE TABLE 表名(列名 integer);
超过范围无法插入
2、大范围整数类型bigint(范围:-9223372036854775808 到 9223372036854775807)
CREATE TABLE 表名(列名 bigint);
超过范围无法插入
3、定点数类型decimal或numeric,用于存储精确的十进制数值
decimal(p, s)
--p:总的位数(包括整数和小数),范围1~1000
--s:小数部分的位数,范围0~p
CREATE TABLE 表名(列名 decimal(10, 2)); --总10位,小数2位
CREATE TABLE 表名(列名 decimal(10, 5)); --总10位,小数5位
小数点也算1位,超过指定位数无法插入数据
4、自增长数值类型serial(范围:1 到 2147483647)
CREATE TABLE 表名(列名 serial);
2.3. 日期类型
日期类型是数据库系统提供的用于存储日期和时间信息的数据类型。
--创建表,指定某列为日期类型
CREATE TABLE 表名(列名 日期类型);
--插入数据必须为日期类型
INSERT INTO 表名 VALUES('2000-01-01 12:00:00');
1、日期+时间类型date(若不插入时间则默认为00:00:00)
CREATE TABLE 表名(列名 date);
2、仅时间类型time(插入日期无效)
CREATE TABLE 表名(列名 time);
2.4. 大对象类型
大对象类型可以存储大型非结构化数据,比如文本、图像、视频、空间数据等。
--创建表,指定某列为大对象类型
CREATE TABLE 表名(列名 大对象类型);
--插入数据必须为大对象类型
INSERT INTO 表名 VALUES("0101");
1、二进制大对象blob(最大长度为1G)
CREATE TABLE 表名(列名 blob);
2、字符大对象clob(最大长度为1G)
CREATE TABLE 表名(列名 clob);
2.5. 布尔类型
布尔类型是数据库系统中用于存储逻辑值(真或假)的数据类型,只能存储两种取值:TRUE(真)和FALSE(假)。
--创建表,指定某列为布尔类型
CREATE TABLE 表名(列名 boolean);
--插入数据必须为布尔类型
INSERT INTO 表名 VALUES(true);
INSERT INTO 表名 VALUES(false);
也可以使用数字代替,0表示假,其他数字表示真
2.6. 网络地址类型
网络地址类型是数据库系统中的一种特殊数据类型,用于存储和表示网络地址信息,例如 IP 地址或者 URL 地址。
1、IPv4和IPv6主机及网络类型inet
CREATE TABLE 表名(列名 inet);
2、cidr类型可以自动补全地址
CREATE TABLE 表名(列名 cidr);
3、以太网硬件地址(MAC)类型macaddr
CREATE TABLE 表名(列名 macaddr);
2.7. UUID类型
UUID类型是一种用于存储全局唯一标识符(Universally Unique Identifier,简称UUID)。UUID是一个128位(16字节)长的标识符,在理论上具有全局唯一性,即使在不同的系统和时间生成的UUID也不会重复。
CREATE TABLE 表名(列名 uuid);
UUID总共为32位,分别由5组不同位组成
8位-4位-4位-4位-12位
例如:
417D5E0B-C9B4-4D80-8CFF-8B74A412DFCB
3. 列级约束
3.1. 主键约束(primary key)
主键约束(Primary Key Constraint)是数据库表中用于唯一标识每一行数据的一种约束。通过定义主键约束,可以确保表中的数据不会出现重复的主键值,从而保证数据的一致性和准确性。且主键约束还可以帮助数据库系统进行索引优化,加快数据检索速度。
主键约束常见添加方法(直接在列名后面添加):
CREATE TABLE 表名(
c1 int primary key, --数据类型后面添加主键约束
c2 int
);
添加主键约束会自动创建一个索引,名为"表名_pkey"
如果希望自定义这个索引名,则需要使用关键字 constraint
CREATE TABLE 表名(
c1 int constraint p_c1 primary key, --指定索引名为p_c1
c2 int
);
创建表时添加主键索引的另一种写法:
CREATE TABLE 表名(
c1 int ,
c2 int ,
CONSTRAINT p_c1 PRIMARY KEY (c1) --指定c1列为主键索引
);
如果创建表时忘记添加主键约束,也可以使用 ALTER TABLE 添加:
CREATE TABLE 表名(
c1 int ,
c2 int
);
--使用alter table添加
ALTER TABLE 表名 ADD CONSTRAINT 索引名 PRIMARY KEY (列名);
主键约束有3个特点:
- 自动创建索引,加速检索效率
- 不允许主键列存在重复值
- 不允许主键列存在空值
3.2. 唯一约束(unique)
唯一约束(Unique Constraint)是数据库表中用于确保某一列或多列的数值在整个列中是唯一的约束,与主键约束类似,但唯一约束允许列中的数据值可以有一个 NULL 值。
唯一约束常见添加方法(直接在列名后面添加):
CREATE TABLE 表名(
c1 int unique, --数据类型后面添加唯一约束
c2 text
);
- 创建唯一约束后同样会自动创建索引
唯一的意思就是不允许数据重复,重复则无法添加
除了在创建表时添加外,同样也可以创建表后再添加:
--通过alter table添加(添加后自动创建唯一索引)
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (列名);
--直接向某张表创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
3.3. 非空约束(not null)
非空约束(NOT NULL Constraint)用于确保表中的某列不接受 NULL 值,任何插入或更新操作都必须为该列提供一个非 NULL 的值。
非空约束常见添加方法(直接在列名后面添加):
CREATE TABLE 表名(
c1 int not null, --数据类型后面添加非空约束
c2 text
);
- 添加非空约束后并不会创建索引,只会限制插入的数据不能为空。
非空约束同样支持创建表以后再添加:
--向某张表添加检查约束(非空)
ALTER TABLE 表名 ADD CONSTRAINT 非空检查名 CHECK (列名 IS NOT NULL);
--修改某张表的列为非空约束
ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;
3.4. 外键约束(foreign key)
外键约束(Foreign Key Constraint)是用来维护表与表之间关联关系的约束,它定义了一个表中的一列(或一组列)与另一个表中的主键或唯一键之间的关系,以确保数据的完整性和一致性。
1、在创建表时添加外键:
--创建第1张表(父表)
CREATE TABLE t1(
t1_c1 INT PRIMARY KEY,
t1_c2 INT,
t1_c3 DATE
);
--创建第2张表(在需要关联列后面使用关键字REFERENCES指定表名(列名))
CREATE TABLE t2(
t2_c1 INT PRIMARY KEY REFERENCES t1(t1_c1), --创建外键,关联t1表
t2_c2 VARCHAR(50)
);
添加外键后,Referenced by表示父表,Foreign-key constraints表示子表
除了在创建表时添加,也可以使用alter table的方式添加:
ALTER TABLE 表名
ADD CONSTRAINT 外键名
FOREIGN KEY (当前表列名) REFERENCES 关联主表名(关联主表列名);
删除外键同样使用alter的方式:
ALTER TABLE 表名 DROP CONSTRAINT 外键名;
创建外键的规则:
- 保证2张表相关联的列数据唯一
- 保证2张表相关联的列类型一致
外键的特点:
- 确保数据完整性: 通过定义父表和子表之间的关系来限制数据的插入和更新,它可以确保子表中的数据始终符合父表中定义的数据关系。
- 维护数据一致性: 当在父表中的数据发生变化时,子表中与之相关联的数据也会同步更新或删除,确保数据的一致性。
- 简化数据操作: 外键约束可以简化数据的操作流程,避免用户手动管理数据关系,减少人为错误的发生,提升数据管理的效率。
- 提高查询性能: 在外键列上创建索引可以提高查询效率,加速数据访问和关联查询的速度,从而提升系统性能。
注意:当删除外键表时,需要先删除子表,再删除父表。
3.5. 检查约束(check)
检查约束(Check Constraint)用于限制表中列的取值范围或条件,指定某列必须满足一个布尔值,这也意味着它支持比较运算。创建检查约束的方法如下:
1、创建表时指定检查约束:
CREATE TABLE 表名(
c1 int check(c1 < 10) --检查该列必须小于10
);
- 大于或等于10则报错
同样支持in语法
CREATE TABLE 表名(
c1 int check(c1 in (10,20)) --检查该列只能为10或20
);
还可以判断日期
--检查该列日期为2024-01-01以前
CREATE TABLE 表名(
c1 date check(c1 < '2024-01-01')
);
--检查日期为6月份以前
CREATE TABLE 表名(
c1 date check(extract(month from c1) < 6)
);
--检查日期为15号以前
CREATE TABLE 表名(
c1 date check(extract(day from c1) < 6)
);
--检查时间为18点以前
CREATE TABLE 表名(
c1 date check(extract(hour FROM c1)*60 + extract(minute from c1) < 1080)
);
2、在已存在的表上添加检查约束:
ALTER TABLE 表名
ADD CONSTRAINT 约束名 CHECK (检查条件);
3、删除约束
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
3.6. 默认约束(default)
默认约束(Default Constraint)用于在表的某列中指定默认值。当插入新记录时,如果没有为列提供值,那么将会自动使用默认约束中指定的值。
1、在创建表时添加默认约束:
CREATE TABLE 表名(
c1 int,
c2 text DEFAULT '小李' --该列默认插入'小李'
);
添加默认约束后,插入数据时如果该列为空,则自动添加默认数据
2、使用alter table对已存在的表添加默认约束:
ALTER TABLE 表名
ADD CONSTRAINT 约束名 DEFAULT 默认值 FOR 列名;
4. 总结
表是数据库中的基本组成单位,用于存储数据。由行和列组成,每行代表一个记录,而每列代表记录中的一个属性。数据库中的表类似于excel中的表格,所以在创建表前需要先了解这张表的作用,在了解作用后再根据数据类型和规则向数据库中创建表。创建表时只需要记住几个关键因素:
- 表的作用:通过 "表名" 和 "描述" 来定义;
- 每列数据是什么类型,比如ID就定义 "整数类型";
- 每列存在哪些规则,比如 "不能为空" 等。
对于新手来说,这些规则有些繁琐。实际上通过这种规范组织的数据,它能够定义数据的结构,每个数据点都安排在表的行和列中,使得数据更加有序和易于管理。并且对于相同类型的数据才能更好的提升检索速度,对于大数据表能够大幅度提升性能。