【金仓数据库】ksql 指南(四) —— 创建与管理表(KingbaseES 数据存储核心)

引言

表是 KingbaseES 存储数据的关键承载对象,所有的业务数据都要经由表来执行组织,本文就"ksql 命令行操作表"展开论述,按照"创建表 → 查看表结构 → 表数据增删改查 → 修改表结构 → 删除表"这一完整生命时段,分解各个阶段的实际操作流程,语法范例以及规避常见错误的指导,使得初学者也能够较为容易地把握住表的主要经营技巧。 @[toc]

一、前置准备:确认操作环境(衔接前文,避免踩坑)

在操作表前,要先做好两项基本准备(参照第三篇"模式与表空间"的内容以维持操作连贯性),这样才能保证后续的表操作得以顺利开展。

1.1 1. 连接本地数据库并切换目标模式

先用 ksql 建立与本地 KingbaseES 数据库的联系(假设是连接 kingbase 库),再转到先前创建的 test_schema 模式,这样做可防止表默认存于 public 模式,从而便于实施分类管理。

sql 复制代码
-- 1. 连接数据库(若未连接)
ksql -d kingbase -U system
-- 2. 切换到 test_schema 模式(若未切换)
SET search_path TO test_schema, public;
-- 验证:查看当前搜索路径,确认 test_schema 在列
SHOW search_path;

执行后若显示 search_path = test_schema, public,表示模式切换成功,后续创建的表会默认存放在 test_schema 模式。

1.2 2. 确认表空间(可选,优化存储)

如果要把表存放到先前创建的 test_ts 表空间(不是默认的 pg_default),首先得确保这个表空间确实存在(可以利用 \db 命令来查看),之后在创建表的时候直接给出指定的表空间名就行了,不需要做其他的设置。

二、创建表:用 CREATE TABLE 定义数据结构

创建表属于数据存储的起始阶段,重点在于"定义表的列,数据类型以及约束",我们针对"常用数据类型"与"核心约束"实施阐述,并且每一个要点均配有实例。

2.1 1. 先懂基础:常用数据类型与约束

新手在创建表之前,要先了解 KingbaseES 的常用数据类型以及约束,防止因为选错类型或者缺少约束而引发后续的问题。

2.2 2. 基础示例:创建简单表(含常用约束)

以创建 "用户表 user_info" 为例,包含 id(主键)、name(非空)、age(CHECK 约束)、phone(唯一)、create_time(默认当前时间),命令如下:

sql 复制代码
CREATE TABLE user_info (
    -- 主键:唯一标识用户,自增(SERIAL 会自动创建序列,避免手动指定ID)
    id SERIAL PRIMARY KEY,
    -- 姓名:非空,最大长度50
    name VARCHAR(50) NOT NULL,
    -- 年龄:1~150之间(CHECK约束)
    age INT CHECK (age > 0 AND age <= 150),
    -- 手机号:唯一,11位(CHAR定长更合适)
    phone CHAR(11) UNIQUE,
    -- 创建时间:默认当前时间(TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) 
-- 可选:指定表空间(使用之前创建的 test_ts)
TABLESPACE test_ts;

关键细节解读:

  • SERIAL 是 KingbaseES 的专属自增类型,其本质为 INT 加上序列,向表中插入数据的时候不必手动给出 id,数据库自身会生成一个唯一值。
  • DEFAULT CURRENT_TIMESTAMP 意味着在插入数据的时候如果没有指定 create_time,那么数据库就会自动把当前的时间填进去。
  • TABLESPACE test_ts表示表存放在test_ts表空间当中,如果没有指定,则默认存放在pg_default` 表空间。

成功验证:

执行后若提示 CREATE TABLE,表示表创建成功。可通过后续 "查看表结构" 命令确认表是否符合预期。

2.3 3. 进阶示例:创建复合主键表(多字段唯一)

若业务需要 "多字段组合唯一"(如 "订单明细表 order_detail",需 order_id + product_id 唯一),可创建复合主键,命令如下:

sql 复制代码
CREATE TABLE order_detail (
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    product_name VARCHAR(100) NOT NULL,
    quantity INT NOT NULL CHECK (quantity >= 1),
    price NUMERIC(10,2) NOT NULL CHECK (price >= 0),
    -- 复合主键:order_id + product_id 组合唯一
    PRIMARY KEY (order_id, product_id)
) TABLESPACE test_ts;

这里主键由 order_idproduct_id 共同构成,确保同一订单下不会有重复的商品记录。

三、查看表结构:确认表定义是否正确

创建好表以后,要经由 ksql 命令来查看表的"基本结构","详细信息"以及"表列表",以保证表的列,约束,表空间等符合预期,这里面包含 \dt\d\d+ 这三个核心命令,下面依次对他们展开阐述。

3.1 1. 查看当前模式下的表列表(\dt)

执行 \dt 命令,可列出当前模式(test_schema)下的所有表,确认表是否存在:

sql 复制代码
\dt

执行结果示例

3.2 2. 查看表的基本结构(\d 表名)

执行 \d 表名 命令时,能够查看表的"列名,数据类型,约束"等关键信息,这个命令是查看表结构最常被用到的。

sql 复制代码
\d user_info

执行结果示例:

3.3 3. 查看表的详细信息(\d+ 表名)

若需了解表的 "存储大小、注释、所有者" 等更详细的信息,执行 \d+ 表名 命令:

sql 复制代码
\d+ user_info

执行结果示例:

新增关键信息:

  • 存储:存储方式(如 plain 适合小数据,extended 适合大数据压缩);
  • 表空间:明确表所在表空间(test_ts);

四、表数据操作:增删改查(CRUD)实战

表创建后,核心是对数据进行 "插入(Create)、查询(Read)、更新(Update)、删除(Delete)" 操作,这是日常业务中最频繁的操作,每个步骤都需结合语法示例和风险提示。

4.1 1. 插入数据(INSERT):向表中添加记录

4.1.1 基础示例:单条数据插入

user_info 表插入一条用户数据(id 自增,无需指定;create_time 有默认值,也可省略):

sql 复制代码
INSERT INTO user_info (name, age, phone)
VALUES ('张三', 25, '13800138000');
4.1.2 进阶示例:多条数据批量插入

批量插入效率更高,只需在 VALUES 后用逗号分隔多条记录:

sql 复制代码
INSERT INTO user_info (name, age, phone)
VALUES 
('李四', 30, '13900139000'),
('王五', 28, '13700137000'),
('赵六', 35, '13600136000');

成功验证:

执行后若提示 INSERT 0 3(数字表示插入的行数),表示批量插入成功。

4.2 2. 查询数据(SELECT):获取表中记录

SELECT 是最灵活的操作,支持 "查询所有列、指定列、条件过滤、排序、限制条数" 等

4.2.1 基础:查询所有记录(慎用!大表会卡死)
sql 复制代码
-- 查询 user_info 表所有列的所有记录
SELECT * FROM user_info;
4.2.2 常用:查询指定列 + 条件过滤

例如 "查询年龄大于 28 的用户,只显示 nameagephone":

sql 复制代码
SELECT name, age, phone 
FROM user_info 
WHERE age > 28;
4.2.3 进阶:排序 + 限制条数

例如 "查询年龄大于 25 的用户,按年龄降序排序,只显示前 2 条":

sql 复制代码
SELECT name, age, phone 
FROM user_info 
WHERE age > 25 
ORDER BY age DESC 
LIMIT 2;

** 执行结果示例:**

4.3 3. 更新数据(UPDATE):修改已有记录

更新操作必须加 WHERE 条件,否则会修改表中所有记录(高危!)

示例:将 "张三" 的年龄改为 26

sql 复制代码
UPDATE user_info 
SET age = 26 
WHERE name = '张三'; -- 条件:只更新姓名为"张三"的记录

成功验证:

执行后若提示 UPDATE 1(表示更新了 1 行),表示更新成功。可通过 SELECT 验证:

sql 复制代码
SELECT name, age FROM user_info WHERE name = '张三';

4.4 4. 删除数据(DELETE):移除表中记录

与更新类似,删除操作必须加 WHERE 条件,否则会删除表中所有数据(不可逆!)。

示例:删除手机号为 "13700137000" 的用户

sql 复制代码
DELETE FROM user_info 
WHERE phone = '13700137000'; -- 条件:只删除指定手机号的记录

成功验证:

执行后若提示 DELETE 1,表示删除成功。可通过 SELECT * FROM user_info 确认数据已移除。

五、修改表结构(ALTER TABLE):适配业务变更

业务需求发生改变的时候,要对表结构执行调整,也就是添加列,更改列类型或者删除列等操作,下面列举一些常见的场景

5.1 1. 添加列(ADD COLUMN)

user_info 表添加 "邮箱列 email",这个列带有唯一约束,可以接受 NULL 值

sql 复制代码
ALTER TABLE user_info 
ADD COLUMN email VARCHAR(100) UNIQUE;

验证:

通过 \d user_info 命令就能看到新出现的 email

5.2 2. 修改列(ALTER COLUMN)

5.2.1 示例 1:修改列长度(如将 name 列从 50 改为 100)
sql 复制代码
ALTER TABLE user_info 
ALTER COLUMN name TYPE VARCHAR(100);
5.2.2 示例 2:修改列默认值(如将 create_time 默认值改为 CURRENT_DATE
sql 复制代码
ALTER TABLE user_info 
ALTER COLUMN create_time SET DEFAULT CURRENT_DATE;

注意:

如果要更改列的类型,那么表里已有的数据得要与新类型相适应,譬如说从 VARCHAR(10) 变成 INT,要是列里面存在 "abc" 这样的字符串就会引发错误

5.3 3. 删除列(DROP COLUMN)

比如删除 user_info 表当中的 age 列(一旦删除,列里的数据就无法恢复,所以务必要小心)

sql 复制代码
ALTER TABLE user_info 
DROP COLUMN IF EXISTS age; -- IF EXISTS 避免列不存在时报错

验证:

\d user_info 命令之后就能察觉到 age 列已经消失不见

5.4 4. 添加约束(ADD CONSTRAINT)

email 列加上 "非空约束",这样就能保证插入的数据一定要包含邮箱信息

sql 复制代码
ALTER TABLE user_info 
ADD CONSTRAINT user_info_email_not_null CHECK (email IS NOT NULL);

验证:

运行 \d user_info 后,可以在 "Check constraints" 部分找到新增的约束 KingbaseES 的 CHECK 约束属于"立即生效"类型,添加时会强制校验全部历史数据以保证数据一致性,若希望约束仅对未来数据生效并忽略历史 NULL 值,则 KingbaseES 本身并不支持此类设置,需先清除历史数据,之后才能创建约束。

5.5 5. 修改表名(RENAME TO)

例如将 user_info 表改名为 sys_user

sql 复制代码
ALTER TABLE user_info 
RENAME TO sys_user;

验证:

执行 \dt,可看到表名已变为 sys_user

六、删除表(DROP TABLE):高危操作!

删除表会永久移除表结构、表数据及关联的索引、约束(不可逆), 删除前必须备份数据

6.1 基础语法(加 IF EXISTS 避免报错)

sql 复制代码
DROP TABLE IF EXISTS sys_user; -- IF EXISTS:表不存在时只提示警告,不报错

6.2 级联删除(CASCADE):删除依赖对象

若表被视图、外键等依赖,直接删除会报错,需加 CASCADE 级联删除依赖对象(极度高危!):

sql 复制代码
DROP TABLE IF EXISTS sys_user CASCADE;

警告:

CASCADE会撤销所有依赖该表的对象,包含依表创建的视图和存在外键关联的表,若未明确表示可弃置所有依赖对象,则不允许执行此操作

七、常见问题排查:新手常踩的坑

问题 1:插入数据报错 "重复键值违反唯一性约束"

报错信息

plaintext 复制代码
ERROR:  duplicate key value violates unique constraint "user_info_phone_key"
DETAIL:  Key (phone)=(13800138000) already exists.

原因 :因为出现的情况是所填入的手机号已被占用,这违背了唯一性限制规则。 解决方案:把手机号改为尚未使用的数值,或者删掉现存的重复记录之后再执行插入操作

问题 2:更新数据报错 "检查约束被违反"

报错信息

plaintext 复制代码
ERROR:  check constraint "user_info_age_check" violated
DETAIL:  Failing row contains (2, 张三, 160, 13800138000, 2024-05-20).

原因 :更新后的年龄(160)超出 CHECK 约束所规定的范围(1~150)。 解决方案:把年龄改为符合约束的值,也就是小于150的数,

问题 3:修改列类型报错 "无法修改被视图或规则引用的列的类型"

报错信息

plaintext 复制代码
ERROR:  cannot alter type of a column used by a view or rule
DETAIL:  column "name" is used by view vw_user.

原因 :这张表(像vw_user这样的视图)存在依赖关系,所以不能直接改变其数据类型。 解决方案 :先删除依赖的视图(DROP VIEW vw_user;),再修改列类型。

总结

本文完整覆盖了表的 "创建→查看→数据操作→结构修改→删除" 全生命周期操作,核心要点可总结为:

  1. 创建表:明确数据类型和约束,结合模式和表空间实现分类管理;
  2. 数据操作涵盖 INSERT,UPDATE 及 DELETE 三部分,要关注 INSERT,UPDATE 和 DELETE 的格式规范,UPDATE 和 DELETE 操作都要加上 WHERE 子句。
  3. 修改结构:ALTER TABLE 支持灵活调整,但需注意数据兼容性;
  4. 删除表:高危操作,务必备份并谨慎使用 CASCADE。

对于 KingbaseES 数据存储来说,表十分关键,掌握了表的经营方法以后,下一篇内容会讲述"索引与视图",利用索引可提升查询速度,依靠视图能简化复杂的查询,进而进一步优化数据库的使用效率。

相关推荐
赵渝强老师8 小时前
【赵渝强老师】TiDB PD集群存储的信息
数据库·mysql·tidb
老纪的技术唠嗑局8 小时前
分库分表MyCat 架构迁移 OceanBase | 百丽核心财务系统迁移经验总结与问题汇总
数据库·架构·oceanbase
xrkhy14 小时前
微服务之ShardingSphere
数据库·微服务·oracle
JIngJaneIL14 小时前
停车场管理|停车预约管理|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·停车场管理系统
煎蛋学姐14 小时前
SSM儿童福利院管理系统ys9w2d07(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·儿童福利院管理系统
sg_knight14 小时前
MySQL 空间索引(SPATIAL)详解:地理位置数据的高效查询利器
数据库·mysql·database·索引·关系型数据库·空间索引·spatial
梦子yumeko16 小时前
第五章Langchain4j之基于内存和redis实现聊天持久化
数据库·redis·缓存
IndulgeCui17 小时前
【金仓数据库产品体验官】KSQL Developer Linux版安装使用体验
linux·运维·数据库
一马平川的大草原17 小时前
基于n8n实现数据库多表数据同步
数据库·数据同步·dify·n8n