it编程 > 数据库 > MsSqlserver

KingbaseES金仓数据库:ksql 命令行从建表到删表实战(含增删改查)

8人参与 2026-01-31 MsSqlserver

前言

    中电科金仓(北京)科技股份有限公司(以下简称“电科金仓”)成立于1999年,是成立最早的拥有自主知识产权的国产数据库企业,也是中国电子科技集团(cetc)成员企业。电科金仓以“提供卓越的数据库产品助力企业级应用高质量发展”为使命,致力于“成为世界卓越的数据库产品与服务提供商”。

    电科金仓自成立起始终坚持自主创新,专注数据库领域二十余载,具备出色的数据库产品研发及服务能力,核心产品金仓数据库管理系统kingbasees(简称“kes”)是面向全行业、全客户关键应用的企业级大型通用数据库。kes产品v9版本已通过国家权威机构认证,产品核心源代码自主率达到100%。2018年,电科金仓申报的“数据库管理系统核心技术的创新与金仓数据库产业化”项目荣获国家科学技术进步二等奖。金仓数据库管理系统kes于2022年入选国务院国资委发布的十项国有企业数字技术典型成果,彰显数据库领域国家队硬实力。继2023年金仓数据库管理系统v8通过第一批《安全可靠测评》后,2024年金仓数据库管理系统v9、金仓分布式htap数据库软件集群v3再度入围,至此电科金仓共计2款产品3个版本通过《安全可靠测评》*。

聚焦金仓数据库(kingbasees)这一国产企业级融合数据库,为开发者及技术决策者提供从基础操作到架构设计的系统化学习路径。从多语法兼容(oracle/mysql/postgresql)、多模数据存储(关系 / 文档 / 时序 / gis)等功能展开讲解!

表在 kingbasees 里就是数据的“专属公寓”,所有业务数据都得乖乖住进这公寓里。今天咱就唠唠“用 ksql 命令行折腾表”的事儿,从“建表→看表结构→增删改查数据→改表结构→删表”这一整套流程,把每个步骤的实操方法、语法例子,还有怎么避开那些让人头大的坑,都给你讲明白。就算是刚摸 kingbasees 的新手,看完也能轻松拿捏表的操作。

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

在跟表较劲之前,有两件基础准备工作得先搞定(大家可以翻回第三篇“模式与表空间”的内容看看,这样操作能更顺),不然后面操作表的时候,指不定就卡壳了。

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

先用 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 模式里,省得你后续到处找表。

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(默认当前时间,不用手动填),命令长这样:

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比varchar合适,毕竟手机号都是11位)
    phone char(11) unique,
    -- 创建时间:默认当前时间(timestamp default current_timestamp,不用手动录时间)
    create_time timestamp default current_timestamp
) 
-- 可选:指定表空间(用之前建的 test_ts)
tablespace test_ts;

关键细节得拎清:

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

有时候业务要求“好几个字段放一起得唯一”(比如“订单明细表 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_idproduct_id 一起构成的,这样就能保证同一个订单里,不会出现重复的商品记录,避免后续算订单金额的时候出乱子。

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

表建好之后,得用 ksql 命令看看表的“基本结构”“详细信息”还有“表列表”,确保表的列、约束、表空间这些都跟你预期的一样。这里面有 \dt\d\d+ 三个核心命令,咱一个一个说。

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

执行 \dt 命令,就能列出当前模式(也就是 test_schema)下所有的表,一眼就能看出你建的表在不在里面。

\dt

执行结果大概长这样:
会显示出当前模式下的表名、表类型、所有者、表空间这些信息,比如能看到 user_infoorder_detail 这两个刚建的表都在列表里。

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

执行 \d 表名 这个命令,能看到表的“列名、数据类型、约束”这些关键信息,平时看表结构,用这个命令最多。

\d user_info

执行结果大概长这样:
会清晰列出 user_info 表每一列的列名、数据类型,还有主键、非空、check、唯一这些约束,比如能看到 id 是 serial 类型且为主键,name 是 varchar(50) 且非空。

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

要是想知道表的“存储大小、注释、所有者”这些更细的信息,那就执行 \d+ 表名 命令。

\d+ user_info

执行结果大概长这样:
除了基本结构里的信息,还会多出存储方式(比如 plain 适合小数据,extended 适合大数据压缩)、表空间(能明确看到表在 test_ts 里)、表的大小、创建时间这些信息,想全面了解表,就看这个。

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

表建好之后,核心就是对数据进行“插入(create)、查询(read)、更新(update)、删除(delete)”操作,这可是平时业务里最常干的活。每个步骤咱都配语法例子,再说说要注意的风险点,别踩坑。

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

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

user_info 表里插一条用户数据(id 是自增的,不用填;create_time 有默认值,也能省了),命令这么写:

insert into user_info (name, age, phone)
values ('张三', 25, '13800138000');

执行完之后,要是没报错,那这条数据就插进去啦。

4.1.2 进阶示例:多条数据批量插入

批量插数据比一条一条插快多了,只要在 values 后面用逗号把多条记录分开就行:

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 基础:查询所有记录(慎用!大表会卡死)
-- 查询 user_info 表所有列的所有记录
select * from user_info;

提醒一句,要是表特别大,数据成千上万条,用这个命令查,数据刷起来没完,还可能把数据库搞卡,所以非必要别用。

4.2.2 常用:查询指定列 + 条件过滤

比如你想“查年龄大于 28 的用户,只看 nameagephone 这三列”,命令这么写:

select name, age, phone 
from user_info 
where age > 28;

执行完之后,就只会显示符合“年龄大于28”条件的用户,而且只显示你指定的三列,不用看一堆没用的信息。

4.2.3 进阶:排序 + 限制条数

再比如“查年龄大于 25 的用户,按年龄从大到小排序,只看前 2 条”,命令是这样的:

select name, age, phone 
from user_info 
where age > 25 
order by age desc 
limit 2;

执行结果大概长这样:
会显示出年龄大于25的用户,按年龄从大到小排好序,而且只显示前两条,比如可能会先显示赵六(35岁),再显示李四(30岁)。

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

更新数据的时候,一定要加 where 条件! 不然没条件限制,会把表里所有记录都改了,那麻烦可就大了,哭都来不及。
例子:把“张三”的年龄改成 26

update user_info 
set age = 26 
where name = '张三'; -- 条件:只改姓名是“张三”的记录

成功没?这么验证:
执行完要是提示 update 1(意思是改了1行数据),那就改成功了。再用 select 命令查查:

select name, age from user_info where name = '张三';

就能看到张三的年龄已经变成26了,没改错人。

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

跟更新数据一样,删除数据也必须加 where 条件,不然会把表里所有数据都删了,而且删了之后还找不回来,千万别手滑!
例子:删除手机号是“13700137000”的用户

delete from user_info 
where phone = '13700137000'; -- 条件:只删手机号是这个的记录

成功没?这么验证:
执行完要是提示 delete 1,那就说明删成功了。再执行 select * from user_info 看看,就能确认那个手机号对应的用户已经没了。

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

业务需求一变,表结构也得跟着改(比如加个列、改列的类型、删个列啥的)。咱说说平时最常用的几种情况,别到时候业务变了,你还不知道怎么改表。

5.1 1. 添加列(add column)

比如给 user_info 表加个“邮箱列 email”(要求邮箱唯一,允许空着),命令这么写:

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)

有时候用户姓名太长,原来的 50 个字符不够用,那就得把列长度改大,命令是这样的:

alter table user_info 
alter column name type varchar(100);

改完之后,name 列就能存最长 100 个字符的姓名了,不用再担心名字太长存不下。

5.2.2 示例 2:修改列默认值(比如把create_time默认值改成current_date)

要是业务只需要记录日期,不用精确到时间,那就把 create_time 的默认值改成只取当前日期,命令这么写:

alter table user_info 
alter column create_time set default current_date;

注意:
改列类型的时候,得确保表里已经有的数据能兼容新类型。比如原来 name 列是 varchar(10),你想改成 int,可列里存的都是“张三”“李四”这种文字,肯定改不了,还会报错,这点可得注意。

5.3 3. 删除列(drop column)

比如想把 user_info 表的 age 列删了(提醒一句,列删了之后,里面的数据也跟着没了,而且找不回来,一定要想清楚再删),命令是这样的:

alter table user_info 
drop column if exists age; -- if exists 是怕列本来就不存在,执行命令的时候报错

验证:
执行 \d user_info 看看,就能发现 age 列已经从表里消失了。

5.4 4. 添加约束(add constraint)

比如想给 email 列加个“非空约束”(要求插数据的时候必须填邮箱,不能空着),命令这么写:

alter table user_info 
add constraint user_info_email_not_null check (email is not null);

验证:
执行 \d user_info ,在“check constraints”那部分,就能看到新增的这个非空约束。
得注意:kingbasees 的 check 约束是“马上生效”的,加约束的时候,会把表里所有旧数据都检查一遍,确保都符合约束要求,这样能保证数据是一致的。要是你想让这约束只对以后新增的数据生效,不管旧数据是不是符合,那 kingbasees 可没这功能,只能先把旧数据改好,符合约束了,再建这个约束。

5.5 5. 修改表名(rename to)

比如想把 user_info 表改名叫 sys_user(可能是为了跟系统里其他表的命名规则统一),命令这么写:

alter table user_info 
rename to sys_user;

验证:
执行 \dt 看看,就能发现表名已经从 user_info 变成 sys_user 了,改得明明白白。

六、删除表(drop table):高危操作!

删表可是个高危操作,表一删,表结构、表里的数据,还有跟表关联的索引、约束,全没了,而且找不回来。所以删表之前,一定要把数据备份好,别脑子一热就删了。

6.1 基础语法(加 if exists 避免报错)

drop table if exists sys_user; -- if exists:要是表本来就不存在,执行命令的时候只会给个警告,不会报错,省得你白担心

执行这条命令之前,再确认一遍数据备份好了,而且这表确实没用了,再下手。

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

有时候这表被视图、外键啥的依赖着,你直接删表,会报错删不了。这时候要是真想删,就得加 cascade 级联删除,把依赖这表的对象也一起删了(这操作更危险!千万别随便用):

drop table if exists sys_user cascade;

警告:
cascade 一加上,所有依赖这表的对象(比如基于这表建的视图、跟这表有外键关联的其他表)都会被一起删掉。除非你能百分百确定这些依赖对象都没用了,否则绝对不能用这个命令,不然删错了,哭都没地方哭。

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

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

报错信息

error:  duplicate key value violates unique constraint "user_info_phone_key"
detail:  key (phone)=(13800138000) already exists.

原因:你想插的手机号,表里已经有了,违反了 phone 列的唯一约束,数据库肯定不让插啊。
解决方案:要么把要插的手机号改成表里没有的,要么先把表里那个重复的手机号对应的记录删了,再插新数据。

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

报错信息

error:  check constraint "user_info_age_check" violated
detail:  failing row contains (2, 张三, 160, 13800138000, 2024-05-20).

原因:你想把张三的年龄改成 160,可之前建表的时候给 age 列加了 check 约束,要求年龄在 1 到 150 之间,160 超出范围了,肯定改不了。
解决方案:把要改的年龄改成符合约束的,比如改成 50、60,只要在 1 到 150 之间就行。

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

报错信息

error:  cannot alter type of a column used by a view or rule
detail:  column "name" is used by view vw_user.

原因:你想改的 name 列,被一个叫 vw_user 的视图用着了,这种情况下,数据库不让直接改列类型,怕把视图搞坏了。
解决方案:先把依赖这列的视图删了(比如执行 drop view vw_user;),再去改列类型,改完之后要是还需要那个视图,再重新建一个就行。

总结

咱今天把表的“创建→查看→数据操作→结构修改→删除”全流程都讲了一遍,核心要点总结一下,方便你记:

  1. 创建表:得把数据类型和约束搞清楚,再结合模式和表空间,这样后续管理表的时候能更有条理,不用东找西找。
  2. 数据操作:主要就是 insert、update、delete 这三个命令。格式得记对,尤其是 update 和 delete,一定要加 where 条件,不然一不小心就把所有数据改了或删了,哭都来不及。
  3. 修改结构:用 alter table 能灵活改表结构,但改的时候得注意数据兼容性,别因为改结构把原来的数据搞坏了。
  4. 删除表:这可是高危操作,删之前必须把数据备份好,而且 cascade 级联删除千万别随便用,不然删错了就麻烦了。

表在 kingbasees 数据存储里可是核心角色,掌握了表的操作方法,后面用数据库就能顺手多了。

到此这篇关于kingbasees金仓数据库:ksql 命令行从建表到删表实战(含增删改查)的文章就介绍到这了,更多相关kingbasees使用ksql 命令行内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

使用Nginx和内网穿透实现多个本地Web站点的公网访问过程

01-31

CentOS配置永久静态IP的流程步骤

02-01

SQL Server删除重复数据的核心方案

01-31

SQL中的UNION ALL和UNION 区别及如何使用

01-31

PostgreSQL向量检索之pgvector入门实战指南

01-31

PostgresSQL安装教程及初始使用操作方法

01-31

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论