首页 > 数据库 >openGauss学习笔记-68 openGauss 数据库管理-创建和管理普通表-向表中插入数据

openGauss学习笔记-68 openGauss 数据库管理-创建和管理普通表-向表中插入数据

时间:2023-09-13 15:33:08浏览次数:40  
标签:customer INSERT INTO 123 VALUES 68 openGauss 向表中

openGauss学习笔记-68 openGauss 数据库管理-创建和管理普通表-向表中插入数据

在创建一个表后,表中并没有数据,在使用这个表之前,需要向表中插入数据。本小节介绍如何使用INSERT命令插入一行或多行数据,及从指定表插入数据。如果有大量数据需要批量导入表中,请参考导入数据

68.1 背景信息

服务端与客户端使用不同的字符集时,两者字符集中单个字符的长度也会不同,客户端输入的字符串会以服务端字符集的格式进行处理,所以产生的最终结果可能会与预期不一致。

表 1 客户端和服务端设置字符集的输出结果对比

操作过程 服务端和客户端编码一致 服务端和客户端编码不一致
存入和取出过程中没有对字符串进行操作 输出预期结果 输出预期结果(输入与显示的客户端编码必须一致)。
存入取出过程对字符串有做一定的操作(如字符串函数操作) 输出预期结果 根据对字符串具体操作可能产生非预期结果。
存入过程中对超长字符串有截断处理 输出预期结果 字符集中字符编码长度是否一致,如果不一致可能会产生非预期的结果。

上述字符串函数操作和自动截断产生的效果会有叠加效果,例如:在客户端与服务端字符集不一致的场景下,如果既有字符串操作,又有字符串截断,在字符串被处理完以后的情况下继续截断,这样也会产生非预期的效果。详细的示例请参见表2

img 说明: 数据库DBCOMPATIBILITY设为兼容TD模式,且td_compatible_truncation参数设置为on的情况下,才会对超长字符串进行截断。

执行如下命令建立示例中需要使用的表table1、table2。

openGauss=# CREATE TABLE table1(id int, a char(6), b varchar(6),c varchar(6));
openGauss=# CREATE TABLE table2(id int, a char(20), b varchar(20),c varchar(20));

表 2 示例

编号 服务端字符集 客户端字符集 是否启用自动截断 示例 结果 说明
1 SQL_ASCII UTF8 openGauss=# INSERT INTO table1 VALUES(1,reverse('123AA78'),reverse('123AA78'),reverse('123AA78')); id |a|b|c ----+------+------+------ 1 | 87| 87| 87 字符串在服务端翻转后,并进行截断,由于服务端和客户端的字符集不一致,字符A在客户端由多个字节表示,结果产生异常。
2 SQL_ASCII UTF8 openGauss=# INSERT INTO table1 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78')); id |a|b|c ----+------+------+------ 2 | 873| 873| 873 字符串翻转后,又进行了自动截断,所以产生了非预期的效果。
3 SQL_ASCII UTF8 openGauss=# INSERT INTO table1 VALUES(3,'87A123','87A123','87A123'); id | a | b | c ----+-------+-------+------- 3 | 87A1 | 87A1 | 87A1 字符串类型的字段长度是客户端字符编码长度的整数倍,所以截断后产生结果正常。
4 SQL_ASCII UTF8 openGauss=# INSERT INTO table2 VALUES(1,reverse('123AA78'),reverse('123AA78'),reverse('123AA78')); openGauss=# INSERT INTO table2 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78')); id |a|b|c ----+-------------------+--------+-------- 1 | 87 321| 87 321 | 87 321 2 | 87321| 87321| 87321 与示例1类似,多字节字符翻转之后不再表示原来的字符。

68.2 操作步骤

向表中插入数据前,意味着表已创建成功。创建表的步骤请参考创建和管理表

68.2.1 向表customer_t1中插入一行

数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。

openGauss=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');

如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。

openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace');

如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如:

openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace');

openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello');

用户也可以对独立的字段或者整个行明确缺省值:

openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT);

openGauss=# INSERT INTO customer_t1 DEFAULT VALUES;

68.2.2 向表中插入多行

如果需要在表中插入多行,请使用以下命令:

openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES 
    (6885, 'maps', 'Joes'),
    (4321, 'tpcds', 'Lily'),
    (9527, 'world', 'James');

如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现。但是建议使用此命令可以提升效率。

68.2.3 从指定表插入数据到当前表

如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令。

openGauss=# CREATE TABLE customer_t2
(
    c_customer_sk             integer,
    c_customer_id             char(5),
    c_first_name              char(6),
    c_last_name               char(8)
);

openGauss=# INSERT INTO customer_t2 SELECT * FROM customer_t1;

img 说明: 从指定表插入数据到当前表时,若指定表与当前表对应的字段数据类型之间不存在隐式转换,则这两种数据类型必须相同。

68.2.4 删除备份表

openGauss=# DROP TABLE customer_t2 CASCADE;

img 说明: 在删除表的时候,若当前需删除的表与其他表有依赖关系,需先删除关联的表,然后再删除当前表。

标签:customer,INSERT,INTO,123,VALUES,68,openGauss,向表中
From: https://blog.51cto.com/shuchaoyang/7455599

相关文章

  • openGauss数据库配置远程连接
     txdb=#showpassword_encryption_type;password_encryption_type--------------------------2(1row)txdb=#altersystemsetpassword_encryption_type=1;ALTERSYSTEMSET 远程连接修改:[rapids@rapids01txdb]$viminstall/data/dn/pg_hba.confipv4增加host  a......
  • PPT| 大型企业数字化转型项目实施方案 P168
    本人从事咨询工作多年,二十年一线数字化规划咨询经验,提供制造业数智化转型规划服务,顶层规划/企业架构/数据治理/数据安全解决方案资料干货.【智能制造数字化咨询】该PPT共168页,由于篇幅有限,以下为部分资料,如需完整原版 方案,点击右上角红色按钮关注+私信。......
  • MT8168安卓核心板_MTK8168核心板规格参数
    MT8168核心板是一款高度整合、高效能、低耗电的应用智能模块,专为平板电脑、电子阅读器、智能家居和物联网应用等嵌入式设备提供出色的多媒体体验。该处理器采用先进而高效能的12nm制程技术,结合了四核ArmCortex-A53MPCoreTM中央处理器和主频可达2GHz的ArmNEON引擎,以及主频可达80......
  • openGauss学习笔记-67 openGauss 数据库管理-创建和管理普通表-创建表
    openGauss学习笔记-67openGauss数据库管理-创建和管理普通表-创建表67.1背景信息表是建立在数据库中的,在不同的数据库中可以存放相同的表。甚至可以通过使用模式在同一个数据库中创建相同名称的表。创建表前请先规划存储模型。67.2创建表执行如下命令创建表。openGauss=#......
  • openGauss数据库tpcc测试
     建表语句CREATETABLESPACEexample2relativelocation'tablespace2';CREATETABLESPACEexample3relativelocation'tablespace3';createtablebmsql_config(cfg_namevarchar(30),cfg_valuevarchar(50));createtablebmsql_wa......
  • CF1868C
    问题链接题意:\(n\)个点,每个点的点权在\([1,m]\)之间,求所有方案的所有路径的最大值的总和首先,对于一条长度为\(x\)的路径,设它的贡献为\(pre_x\),他的最大值取值有\(m\)种,其中最大值为\(i\)的取值有\(i^x-i^{x-1}\)种,而除了该路径外的所有点的取值一共能构造出\(m^{n-x}\)种方案,那......
  • RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个D
    前言  前面发现开发板用ubuntu固件发现空间不够,本篇使用buildroot固件,来实现目标板运行qt界面应用。<br>烧写buildroot固件  这部分更详细的参照《RK3568开发笔记(六):开发板烧写ubuntu固件(支持mipi屏)》的步骤,本质上烧写都是一样的,只是不同的update.img。步骤一:下载镜像  ......
  • RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个D
    前言  前面发现开发板用ubuntu固件发现空间不够,本篇使用buildroot固件,来实现目标板运行qt界面应用。 烧写buildroot固件  这部分更详细的参照《RK3568开发笔记(六):开发板烧写ubuntu固件(支持mipi屏)》的步骤,本质上烧写都是一样的,只是不同的update.img。步骤一:下载......
  • openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema
    openGauss学习笔记-66openGauss数据库管理-创建和管理schema66.1背景信息schema又称作模式。通过管理schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的schema下而不引起冲突。管理schema包括:创建schema......
  • sol. CF1680F Lenient Vertex Cover
    CF1680FLenientVertexCover下面用\(G\)表示一个环的边集,记作环\(G\)。我们令一个环\(G\)的价值为它经过的返祖边数量,记作\(Z(G)\),下面给出核心结论:若存在一条边\(e_0\)经过所有\(Z(G)=1\)的奇环,且不经过任意一个\(Z(G)=1\)的偶环,那么\(e_0\)经过所有奇环......