崩溃大陆2免安装绿色中文版
387M · 2025-11-04
表是 KingbaseES 存储数据的关键承载对象,所有的业务数据都要经由表来执行组织,本文就“ksql 命令行操作表”展开论述,按照“创建表 → 查看表结构 → 表数据增删改查 → 修改表结构 → 删除表”这一完整生命时段,分解各个阶段的实际操作流程,语法范例以及规避常见错误的指导,使得初学者也能够较为容易地把握住表的主要经营技巧。
@[toc]
在操作表前,要先做好两项基本准备(参照第三篇“模式与表空间”的内容以维持操作连贯性),这样才能保证后续的表操作得以顺利开展。
先用 ksql 建立与本地 KingbaseES 数据库的联系(假设是连接 kingbase 库),再转到先前创建的 test_schema 模式,这样做可防止表默认存于 public 模式,从而便于实施分类管理。
-- 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 模式。
如果要把表存放到先前创建的 test_ts 表空间(不是默认的 pg_default),首先得确保这个表空间确实存在(可以利用 db 命令来查看),之后在创建表的时候直接给出指定的表空间名就行了,不需要做其他的设置。
创建表属于数据存储的起始阶段,重点在于“定义表的列,数据类型以及约束”,我们针对“常用数据类型”与“核心约束”实施阐述,并且每一个要点均配有实例。
新手在创建表之前,要先了解 KingbaseES 的常用数据类型以及约束,防止因为选错类型或者缺少约束而引发后续的问题。
以创建 “用户表 user_info” 为例,包含 id(主键)、name(非空)、age(CHECK 约束)、phone(唯一)、create_time(默认当前时间),命令如下:
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,那么数据库就会自动把当前的时间填进去。表示表存放在test_ts表空间当中,如果没有指定,则默认存放在pg_default` 表空间。成功验证:
执行后若提示 CREATE TABLE,表示表创建成功。可通过后续 “查看表结构” 命令确认表是否符合预期。
若业务需要 “多字段组合唯一”(如 “订单明细表 order_detail”,需 order_id + product_id 唯一),可创建复合主键,命令如下:
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_id 和 product_id 共同构成,确保同一订单下不会有重复的商品记录。
创建好表以后,要经由 ksql 命令来查看表的“基本结构”,“详细信息”以及“表列表”,以保证表的列,约束,表空间等符合预期,这里面包含 dt,d,d+ 这三个核心命令,下面依次对他们展开阐述。
执行 dt 命令,可列出当前模式(test_schema)下的所有表,确认表是否存在:
dt
执行结果示例
执行 d 表名 命令时,能够查看表的“列名,数据类型,约束”等关键信息,这个命令是查看表结构最常被用到的。
d user_info
执行结果示例:
若需了解表的 “存储大小、注释、所有者” 等更详细的信息,执行 d+ 表名 命令:
d+ user_info
执行结果示例:
新增关键信息:
存储:存储方式(如 plain 适合小数据,extended 适合大数据压缩);表空间:明确表所在表空间(test_ts);表创建后,核心是对数据进行 “插入(Create)、查询(Read)、更新(Update)、删除(Delete)” 操作,这是日常业务中最频繁的操作,每个步骤都需结合语法示例和风险提示。
向 user_info 表插入一条用户数据(id 自增,无需指定;create_time 有默认值,也可省略):
INSERT INTO user_info (name, age, phone)
VALUES ('张三', 25, '13800138000');
批量插入效率更高,只需在 VALUES 后用逗号分隔多条记录:
INSERT INTO user_info (name, age, phone)
VALUES 
('李四', 30, '13900139000'),
('王五', 28, '13700137000'),
('赵六', 35, '13600136000');
成功验证:
执行后若提示 INSERT 0 3(数字表示插入的行数),表示批量插入成功。
SELECT 是最灵活的操作,支持 “查询所有列、指定列、条件过滤、排序、限制条数” 等
-- 查询 user_info 表所有列的所有记录
SELECT * FROM user_info;
例如 “查询年龄大于 28 的用户,只显示 name、age、phone”:
SELECT name, age, phone 
FROM user_info 
WHERE age > 28;
例如 “查询年龄大于 25 的用户,按年龄降序排序,只显示前 2 条”:
SELECT name, age, phone 
FROM user_info 
WHERE age > 25 
ORDER BY age DESC 
LIMIT 2;
** 执行结果示例:**
更新操作必须加 WHERE 条件,否则会修改表中所有记录(高危!)
示例:将 “张三” 的年龄改为 26
UPDATE user_info 
SET age = 26 
WHERE name = '张三'; -- 条件:只更新姓名为“张三”的记录
成功验证:
执行后若提示 UPDATE 1(表示更新了 1 行),表示更新成功。可通过 SELECT 验证:
SELECT name, age FROM user_info WHERE name = '张三';
与更新类似,删除操作必须加 WHERE 条件,否则会删除表中所有数据(不可逆!)。
示例:删除手机号为 “13700137000” 的用户
DELETE FROM user_info 
WHERE phone = '13700137000'; -- 条件:只删除指定手机号的记录
成功验证:
执行后若提示 DELETE 1,表示删除成功。可通过 SELECT * FROM user_info 确认数据已移除。
业务需求发生改变的时候,要对表结构执行调整,也就是添加列,更改列类型或者删除列等操作,下面列举一些常见的场景
向 user_info 表添加 “邮箱列 email”,这个列带有唯一约束,可以接受 NULL 值
ALTER TABLE user_info 
ADD COLUMN email VARCHAR(100) UNIQUE;
验证:
通过 d user_info 命令就能看到新出现的 email 列
name 列从 50 改为 100)ALTER TABLE user_info 
ALTER COLUMN name TYPE VARCHAR(100);
create_time 默认值改为 CURRENT_DATE)ALTER TABLE user_info 
ALTER COLUMN create_time SET DEFAULT CURRENT_DATE;
注意:
如果要更改列的类型,那么表里已有的数据得要与新类型相适应,譬如说从 VARCHAR(10) 变成 INT,要是列里面存在 “abc” 这样的字符串就会引发错误
比如删除 user_info 表当中的 age 列(一旦删除,列里的数据就无法恢复,所以务必要小心)
ALTER TABLE user_info 
DROP COLUMN IF EXISTS age; -- IF EXISTS 避免列不存在时报错
验证:
行 d user_info 命令之后就能察觉到 age 列已经消失不见
给 email 列加上 “非空约束”,这样就能保证插入的数据一定要包含邮箱信息
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 本身并不支持此类设置,需先清除历史数据,之后才能创建约束。
例如将 user_info 表改名为 sys_user:
ALTER TABLE user_info 
RENAME TO sys_user;
验证:
执行 dt,可看到表名已变为 sys_user。
删除表会永久移除表结构、表数据及关联的索引、约束(不可逆), 删除前必须备份数据
DROP TABLE IF EXISTS sys_user; -- IF EXISTS:表不存在时只提示警告,不报错
若表被视图、外键等依赖,直接删除会报错,需加 CASCADE 级联删除依赖对象(极度高危!):
DROP TABLE IF EXISTS sys_user CASCADE;
警告:
CASCADE会撤销所有依赖该表的对象,包含依表创建的视图和存在外键关联的表,若未明确表示可弃置所有依赖对象,则不允许执行此操作
报错信息:
ERROR:  duplicate key value violates unique constraint "user_info_phone_key"
DETAIL:  Key (phone)=(13800138000) already exists.
原因:因为出现的情况是所填入的手机号已被占用,这违背了唯一性限制规则。 解决方案:把手机号改为尚未使用的数值,或者删掉现存的重复记录之后再执行插入操作
报错信息:
ERROR:  check constraint "user_info_age_check" violated
DETAIL:  Failing row contains (2, 张三, 160, 13800138000, 2024-05-20).
原因:更新后的年龄(160)超出 CHECK 约束所规定的范围(1~150)。 解决方案:把年龄改为符合约束的值,也就是小于150的数,
报错信息:
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;),再修改列类型。
本文完整覆盖了表的 “创建→查看→数据操作→结构修改→删除” 全生命周期操作,核心要点可总结为:
WHERE 子句。对于 KingbaseES 数据存储来说,表十分关键,掌握了表的经营方法以后,下一篇内容会讲述“索引与视图”,利用索引可提升查询速度,依靠视图能简化复杂的查询,进而进一步优化数据库的使用效率。