openGauss开源数据库实战十二

文章目录

  • 任务十二 openGauss逻辑结构:表管理
    • 任务目标
    • 实施步骤
      • 一、准备工作
      • 二、创建表
        • 1.新建表默认保存在public模式中
        • 2.在一个数据库的不同模式下创建表
        • 3.创建表的时候定义约束
        • 4.创建表时使用自增数据类型
        • 5.使用现有的表创建新表
      • 三、查看表的信息
        • 1.在gsql中查看表的定义
        • 2.查看当前数据库中有哪些模式属于某个用户
        • 3.查看模式搜索路径下有哪些表
        • 4.查看某个模式下有哪些表
        • 5.查看一个表下有哪些约束
        • 6.查看一个表属于哪个数据库的哪个模式
      • 四、修改表
        • 1.为表添加字段
        • 2.删除表中的已有字段
        • 3.删除表的已有约束
        • 4.为表添加约束
        • 5.修改表中字段的默认值
        • 6.修改表中字段的数据类型
        • 7.修改表中字段的名字
        • 8.修改表的名字
      • 五、清除表中的数据
      • 六、删除表
      • 七、任务的扫尾工作

任务十二 openGauss逻辑结构:表管理

任务目标

本任务的目标是熟练掌握关系表的管理,包括创建表、在创建表时定义约束(列级约束和表级约束)、修改表(添加字段、删除字段、添加约束、删除约束、修改数据类型、修改字段的名字、修改字段的默认值)。

实施步骤

一、准备工作

使用Linux用户omm打开一个Linux终端窗口,执行如下的命令,创建表空间ustbs、数据库ustbdb、用户temp,并授予用户temp SYSADMIN权限:

gsql -d postgres -p 26000 -r
CREATE TABLESPACE ustb_ts RELATIVE LOCATION 'tablespace/ustb_ts1';
CREATE DATABASE ustbdb WITH TABLESPACE = ustb_ts;
CREATE USER temp IDENTIFIED BY 'temp@ustb2020';
ALTER USER temp  SYSADMIN;
\q

使用Linux用户omm,另外打开一个Linux终端窗口,以数据库用户temp的身份,连接到刚刚创建的数据库ustbdb:

gsql -d ustbdb -h 192.168.100.91 -U temp -p 26000 -W temp@ustb2020 -r

执行下面的SQL语句,创建模式jtjsj和jtxa:

create schema jtjsj;
create schema jtxa;

二、创建表

1.新建表默认保存在public模式中

新创建的表默认保存在数据库的public模式中。执行下面的命令,查看当前的模式搜索路径:

show SEARCH_PATH;

注意:需要确保新创建的表在数据库的public模式中。
否则需要手动修改,操作如下:

gsql -d postgres -p 26000 -r
ALTER USER temp SET SEARCH_PATH TO public;

执行下面的SQL语句,创建一个测试表testtable,并插入一条数据:

drop table if exists testtable;
create table testtable(col varchar(100));
insert into testtable values('Hello from testtable!');
select * from testtable;

执行下面的SQL语句,查看当前数据库ustbdb的public模式中有哪些表:

select table_catalog,table_schema,table_name,table_type
from information_schema.tables 
where table_schema = 'public';

实验结论:默认情况下,在某个数据库上创建的数据库对象(本例是表testtable),都位于该数据库的public模式中。

2.在一个数据库的不同模式下创建表

执行下面的命令,查看当前的模式搜索路径:

show SEARCH_PATH;SET SEARCH_PATH TO jtjsj;show SEARCH_PATH;

执行下面的SQL语句,在数据库ustbdb的模式jtjsj中创建表testtable、testtable1、testtable2:

create table testtable(col1  char(100));
create table testtable1(col1 char(100));
create table testtable2(col1 char(100));

可以看出,在不同的模式(public和jtjsj)中可以创建同名的表testtable(其定义可以不同,一个列的数据类型是varchar(100),另一个列的数据类型是char(100))。
执行下面的语句,为模式jtjsj下的表testtable插人一条测试数据(由于当前的模式搜索路径为模式jtjsj,因此不需要指定模式名,就可以为jtjsj.testtable插入新行):

insert into testtable values('Hello from testtable IN SCHEMA jtjsj!');
select * from testtable;

虽然当前模式搜索路径没有模式jxa,但是我们仍然可以在模式jxa中创建表,方法是使用SchemaName.TableName的方式来指定在哪个模式下创建表。下面的实验演示了这一点。
执行下面的SOL语句,将在数据库ustbdb的模式jtxa中创建表testtable、testtable1、testtable2,并向模式jtxa中新创建的表testtable插人一条数据:

create table jtxa.testtable(col1  char(100));
create table jtxa.testtable1(col1 char(100));
create table jtxa.testtable2(col1 char(100));
insert into jtxa.testtable values('Hello from testtable IN SCHEMA jtis!');
select * from jtxa.testtable;
\q

最后再次实验一下openGauss在某个用户连接到某个数据库时,可以访问该数据库中不同模式下的数据表。使用Linux用户omm,另外打开一个Linux终端窗口,执行如下命令,以数据库用户temp的身份连接到数据库ustbdb:

gsql -d ustbdb -h 192.168.100.91 -U temp -p 26000 -W temp@ustb2020 -r
--  查看当前会话的模式搜索顺序
show SEARCH_PATH;
--  查看不同模式下的表
select * from testtable;
select * from jtjsj.testtable;
select * from jtxa.testtable;
\q
3.创建表的时候定义约束

(1)创建表时定义列级约束执行下面的命令和SQL语句,体验一下在创建表的时候为表定义列级约束:

gsql -d ustbdb -h 192.168.100.91 -U temp -p 26000 -W temp@ustb2020 -r
drop table if exists test;
create table test(id bigint primary key,      -- 创建列级主键约束name varchar(50) not null,  -- 创建列级not null约束age  int);
insert into test values(1,'temp',50);
select * from test;

在这里插入图片描述
这个例子中,我们在列级定义了主键约束(id列)和NOTNULL约束(name列)
(2)创建表时定义表级约束执行下面的SQL语句,体验一下在创建表的时候为表定义表级约束:

drop table if exists test;
create table test(id bigint,name varchar(50) not null,  -- 创建列级not null约束age  int,-- 创建表级约束primary key(id));
insert into test values(1,'temp',50);
select * from test;

在这里插入图片描述
这里在表级定义了主键约束(id列),在列级定义了NOTNULL约束(name列)。在定义单列约束时,表级约束和列级约束没有区别,但无法在表级定义作用在多列上的约束。
(3)为表的属性定义默认值 执行下面的语句,体验一下在创建表的时候为表的某个列定义默认值:

drop table if exists test;
create table test(id bigint,name varchar(50) not null,age  int default 20,  --  为该列定义默认值为20--  如果插入数据时未提供该列的值,将默认插入20primary key(id));insert into test(id,name) values(1,'temp');
select * from test;

可以看到,插人数据时虽然没有提供age列的值,但结果显示为该行的age列提供了默认值20。如果在创建表的时候,没有为某列定义默认值,缺省的默
认值是空值null。执行下面的SQL语句可以验证这一点:

drop table if exists test;
create table test(id bigint,name varchar(50) not null,age  int,           --  未定义该列的默认值--  如果插入数据时未提供该列的值,将默认插入空值nullprimary key(id));
insert into test(id,name) values(1,'temp');
select * from test;

在这里插入图片描述
可以看到,插入数据时没有为age列提供具体的值,并且没有显式定义age列的默认值,结果显示新行的age列的值是空值 null。

4.创建表时使用自增数据类型

发票的编号通常按顺序递增,这种情况可以使用serial数据类型。有两种方法可以完成编号顺序递增的任务。
第一种方法是直接使用serial数据类型。执行下面的SQL语句,创建一个带有serial数据类型的测试表invoice:

drop table if exists invoice;
create table invoice(invoicenum serial NOT NULL,name varchar(20));

执行下面的SQL语句,为表invoice插入3条记录,并查看插入数据后表的数据:

insert into invoice(name) values('temp');
insert into invoice(name) values('temp1');
insert into invoice(name) values('temp2');
select * from invoice;

可以看到,每插人一条记录到表invoice后,invoicenum列的值会自增1。

第二种方法是先创建一个系列,然后将表列的默认值设置为该系列的下一个值。执行下面的语句,首先创建一个系列:

DROP SEQUENCE if exists invoicenum_seq;
CREATE SEQUENCE invoicenum_seqSTART WITH 1INCREMENT BY 1NO MINVALUENO MAXVALUECACHE 1;

创建表的时候,指定某个列的默认值为该系列下一个要取的值:

DROP TABLE if exists invoice;
create table invoice(invoicenum bigint DEFAULT nextval('invoicenum_seq'),name varchar(20));

执行下面的命令,插人一些数据并进行查看:

insert into invoice(name) values('temp');
insert into invoice(name) values('temp1');
insert into invoice(name) values('temp2');
select * from invoice;

可以看到,每插入一条记录到表invoice后,invoicenum列的值会自增1。

5.使用现有的表创建新表

执行下面的SQL语句将创建新表,并且会将旧表的数据拷贝给新表:

DROP TABLE if exists newtestwithdata;
CREATE TABLE newtestwithdata AS SELECT * FROM test;
SELECT * FROM newtestwithdata;

执行下面的SQL语句,将创建新表,并且不会将旧表的数据拷贝给新表:

DROP TABLE if exists testnewwithoutdata;
CREATE TABLE testnewwithoutdata AS SELECT * FROM test WHERE 1=2;
SELECT * FROM testnewwithoutdata;

注意:CREATETABLE语句中的WHERE子句,其谓词条件1=2在逻辑上永远为假,因此不会有表中的任何行数据满足谓词要求,最终结果自然是创建了一个空表。

三、查看表的信息

首先创建一个测试表:

drop table if exists test;
create table test(id bigint,name varchar(50) not null,age  int default 20,primary key(id));
1.在gsql中查看表的定义

在gsql中,使用\dtableNmae命令可以查看表的信息。
执行下面的gsql元命令,查看表test的信息:

\d test
2.查看当前数据库中有哪些模式属于某个用户

执行下面的SQL语句,查看属于用户temp的模式有哪些:

SELECT catalog_name,schema_name,schema_owner 
FROM information_schema.schemata 
WHERE schema_owner='temp';
3.查看模式搜索路径下有哪些表

执行下面的gsql元命令,查看模式搜索路径下有哪些表:

\dt
4.查看某个模式下有哪些表

执行下面的SQL语句,查看模式jtsj下的所有表名:

SELECT table_name FROM information_schema.tables WHERE table_schema='jtjsj';

执行下面的SQL语句,查看模式jtxa下的所有表名:

SELECT table_name FROM information_schema.tables WHERE table_schema='jtxa';
\q
5.查看一个表下有哪些约束

使用gsql的元命令\d tableName可以很方便地查看一个表下有哪些约束。示例如下:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
\d instructor

也可以使用下面的SQL语句来查看表instructor下的约束:

select conname, connamespace, contype, conkey     
from pg_constraint 
where conrelid in (  select oidfrom pg_classwhere relname='instructor');
6.查看一个表属于哪个数据库的哪个模式

执行下面的SQL语句,查看表instructor属于哪个数据库的哪个模式:

\x on
SELECT * FROM information_schema.tables WHERE table_name='instructor';
\x off

可以看出,表instructor属于数据库studentdb的public模式。

四、修改表

首先创建一个测试表:

drop table if exists test;
create table test(id bigint,name varchar(50) not null,age  int default 20,primary key(id));
1.为表添加字段

执行下面的gsql元命令,查看表test的信息:

\d test

执行下面的SOL语句,为表test新增一列,列名为sex,数据类型为boolean:

alter table test add column sex Boolean;
执行下面的gsql元命令,查看表test的信息:
```sql
\d test
2.删除表中的已有字段

执行下面的SOL语句,删除刚刚添加的sex列:

alter table test drop column sex ;

执行下面的gsql元命令,再次查看表test的信息:

\d test

可以看到,sex列已经从表test中消失了。

3.删除表的已有约束

执行下面的gsql元命令,查看表test的信息:

\d test

可以看到,表test下有一个名为testpkey的主键约束。执行下面的SQL语句,删除这个约束:

alter table test drop constraint test_pkey;

执行下面的gsql元命令,再次查看表test的信息:

\d test

我们发现表test下已经没有了testpkey这个主键约束。

4.为表添加约束

执行下面的SQL命令,为表test添加刚刚删除的主键约束:

alter table test add constraint test_pkey primary key(id);

执行下面的gsql元命令,再次查看表test的信息:

\d test

可以看到,已经为表test的id列重新添加了名为test_pkey的主键约束。

5.修改表中字段的默认值

执行下面的gsql元命令,查看表test的信息:

\d test

可以看到,age当前的默认值是20。
尝试插人一条记录,但不提供age的值,看看效果:

insert into test(id,name) values(10,'temp');
select * from test;

执行下面的SQL语句,将age的默认值变更为25:

alter table test alter column age set default 25;

执行下面的gsql元命令,再次查看表test的信息:

\d test

输出显示,agc的默认值已经变更为25了。
再次尝试插入一条记录,但是不提供age的值,进行测试:

insert into test(id,name) values(5,'temp');
select * from test;

输出表明,尽管插入数据时没有提供age的值,但在将记录插入数据库时,还是为该记录的age提供了默认值25。
我们也可以删除默认值。删除默认值,将导致默认值为NULL。执行下面的语句,删除age的默认值:

alter table test alter column age DROP default;

执行下面的gsql元命令,再次查看表test的信息:

\d test

可以看到,表test的age没有默认值了。执行下面的语句,插人一条新的记录,还是不提供age的值,进行测试:

insert into test(id,name) values(6,'temp');
select * from test;

可以看到,刚刚执行的语句由于没有提供age的值,因此将新行的age值存储为NULL

6.修改表中字段的数据类型

我们可以修改表中字段的数据类型。执行下面的语句,将age列的数据类型由int变更为bigint:

alter table test ALTER COLUMN age TYPE bigint;

修改数据类型时,如果一些行在该列上已经有值了,那么修改后的数据类型应能与现有的值相兼容,并且存储空间也必须能够容纳原有的值(修改后数据类型的存储长度需要足够大)。

7.修改表中字段的名字

我们可以修改表中字段的名字。执行下面的SOL语句,将age列的名字变更为stuage:

ALTER TABLE test RENAME COLUMN age TO stuage;

执行下面的gsql元命令,再次查看表test的信息:

\d test

我们看到,表中age列的名字已经被更名成stuage。

8.修改表的名字

我们可以修改表的名字。执行下面的SQL语句,将表test的名字变更为mytest:

\dt
ALTER TABLE test RENAME TO mytest;
\dt

可以看到,表test的名字已经被变更为mytest。

五、清除表中的数据

有时候我们需要保留一个表的定义,但是要把该表中的数据都删除。这可以通过执行数据操纵语言(DML)的DELETE语句来完成。但因为DELETE语句是DML语句,会生成很多操作日志,如果表的行数比较多,执行速度会比较慢。
使用TRUNCATE TABLE语句可以快速将一个有很多数据的表置成空表,因为TRUNCATE TABLE语句是数据定义语言(DDL)语句。
执行下面的SQL语句,将表test的内容清空(保留表test的结构):

select * from mytest;
truncate table mytest;
\dt mytest
select * from mytest;

六、删除表

使用DROPTABLE语句删除表的话,不但会删除表中的数据,而且会将表的定义删除。示例如下:

\dt
DROP TABLE mytest;
\dt
\q

七、任务的扫尾工作

在继续后面的任务之前,打开另外一个Linux终端窗口,执行下面的命令,做以下清理工作:

gsql -d postgres -p 26000 -r
drop database ustbdb;
drop user temp;
drop tablespace ustb_ts;
\q

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461411.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详解精细化工行业持续增长的策略与路径解析

随着全球经济的快速发展和科技的不断进步,精细化工行业正面临着前所未有的挑战和机遇。在这个过程中,数字化转型已成为推动行业持续增长的关键因素。精细化工行业,作为化学工业的一个重要分支,其产品广泛应用于医药、农药、涂料、…

医疗器械设备语音ic芯片方案-选型大全

在医疗设备领域,深圳唯创知音提供了多款适用的语音IC产品,以下是其中几款较为常见的推荐: 一、WT588F02X-8S 特点: 1:低成本人机交互语音方案,仅需嵌入在产品中,提升医疗设备智能化水平。 2&…

微服务实战系列之玩转Docker(十七)

导览 前言Q:如何实现etcd数据的可视化管理一、创建etcd集群1. 节点定义2. 集群成员2.1 docker ps2.2 docker exec2.3 etcdctl member list 二、发布数据1. 添加数据2. 数据共享 三、可视化管理1. ETCD Keeper入门1.1 简介1.2 安装1.2.1 定义compose.yml1.2.2 启动ke…

Spring Cloud +UniApp智慧工地源码,智慧工地综合解决方案,建筑工程云平台源码

Spring Cloud UniApp智慧工地源码,智慧工地全套源代码包含:PC端大屏端移动端 智慧工地解决方案以工程建设现场管理需求为主线,以AI、物联网、BIM技术为手段,对施工现场进行立体化、全方位、全时段管理,实现规范施工管…

Python 从入门到实战43(Pandas数据结构)

我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们学习了NumPy数组操作的相关基础知识。今天学习一下pa…

数字信号处理Python示例(1)使用Python生成正弦信号

文章目录 前言一、连续时间周期信号二、正弦波三、使用Python生成正弦信号的步骤内置库说明 四、完整的python代码与运行结果1.完整的python代码2、运行结果 五、总结 前言 介绍如何使用python生成正弦信号,给出详细步骤和完整的python代码和运行结果。 一、连续时…

树叶分类竞赛(Baseline)以及kaggle的GPU使用

树叶分类竞赛(Baseline)-kaggle的GPU使用 文章目录 树叶分类竞赛(Baseline)-kaggle的GPU使用竞赛的步骤代码实现创建自定义dataset定义data_loader模型定义超参数训练模型预测和保存结果 kaggle使用 竞赛的步骤 本文来自于Neko Kiku提供的Baseline,感谢大佬提供代码…

四足机器人实战篇之二十二:四足机器人支撑腿反作用力规划之反馈控制及线性约束条件优化方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、先使用反馈+前馈的控制方式,根据躯干期望的位置速度,计算出当前身体姿态的虚拟反作用力(实现躯体平衡控制器)二、再建立线性约束的凸优化问…

企业物流管理数据仓库建设的全面指南

文章目录 一、物流管理目标二、总体要求三、数据分层和数据构成(1)数据分层(2)数据构成 四、数据存储五、数据建模和数据模型(1)数据建模(2)数据模型 六、总结 在企业物流管理中&…

设计模式基础概念(行为模式):责任链模式(Chain Of Responsibility)

概述 责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。 该模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于…

centos7 安装python3.9.4,解决import ssl异常

本篇文章介绍如何在centos7中安装python3.9.4(下文简称python3),解决python3安装后import ssl模块失败问题,为什么我要在centos7中安装python呢,因为我需要在服务器中跑python数据处理脚本。 安装python3同时解决import ssl模块失败问题总共包…

【分布式技术】分布式序列算法Snowflake深入解读

文章目录 概述Snowflake算法的构成:Snowflake算法的特点:Snowflake算法存在的问题: 🔍 雪片算法在分布式系统中是如何保证ID的唯一性和有序性的?唯一性(Uniqueness)有序性(Orderline…

纯CSS实现UI设计中常见的丝带效果(5)

原文传送门:纯CSS实现UI设计中常见的丝带效果 网页中的丝带效果在设计中扮演着多重角色,其作用可以归纳为以下几个方面: 视觉吸引与装饰 增强视觉吸引力:丝带效果以其独特的形态和色彩,能够迅速吸引用户的注意力&…

TP41Y阀套式排污阀

在现代工业领域中,阀门作为一种关键的控制元件,广泛应用于各种流体系统中。其中,TP41Y阀套式排污阀以其独特的设计和优异的性能,在石油、天然气、化工等行业中占据了重要的地位。本文将对TP41Y阀套式排污阀进行详细的专业解析&…

Python | Leetcode Python题解之第522题最长特殊序列II

题目&#xff1a; 题解&#xff1a; class Solution:def findLUSlength(self, strs: List[str]) -> int:def is_subseq(s: str, t: str) -> bool:pt_s pt_t 0while pt_s < len(s) and pt_t < len(t):if s[pt_s] t[pt_t]:pt_s 1pt_t 1return pt_s len(s)ans …

Flink SQL中Changelog事件乱序处理原理

本文围绕Flink SQL实时数据处理中的Changelog事件乱序问题&#xff0c;分析了Flink SQL中Changelog事件乱序问题的原因&#xff0c;并提供了解决方案以及处理Changelog事件乱序的建议。以帮助您更好地理解Changelog的概念和应用&#xff0c;更加高效地使用Flink SQL进行实时数据…

HTML CSS

目录 1. 什么是HTML 2. 什么是CSS ? 3. 基础标签 & 样式 3.1 新浪新闻-标题实现 3.1.1 标题排版 3.1.1.1 分析 3.1.1.2 标签 3.1.1.3 实现 3.1.2 标题样式 3.1.2.1 CSS引入方式 3.1.2.2 颜色表示 3.1.2.3 标题字体颜色 3.1.2.4 CSS选择器 3.1.2.5 发布时间字…

Open3D(C++) 基于法线微分的点云分割

目录 一、算法原理二、代码实现三、结果展示1、原始点云2、分割结果本文由CSDN点云侠原创,原文链接,首发于:2024年11月1日。 一、算法原理 使用C++版本Open3D复现的PCL里边基于法线微分的分割算法。PCL 基于法线微分(DoN)的点云分割【2024最新版】。网上有大量相关算法介…

Xcode 15.4 运行flutter项目,看不到报错信息详情?

Xcode升级后&#xff0c;遇到了奇怪的事情&#xff1a; 运行flutter项目&#xff0c;左侧栏显示有报错信息&#xff0c;但是点击并没有跳转出具体的error详情。【之前都会自己跳转出来的&#xff0c;升级后真的是无厘头】 方案&#xff1a; 点击左侧导航栏最右边的图标——>…

Java基础(8)异常

目录 1.前言 2.正文 2.1异常的引入 2.2异常的类型 2.2.1编译时异常 2.2.2运行时异常 2.3区分Exception与Error 2.4异常的声明&#xff0c;抛出与捕获 2.4.1throw 2.4.2throws 2.4.2try-catch与finally 2.6自定义异常 3.小结 1.前言 哈喽大家好啊&#xff0c;Java…