深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 : 个人主页

OceanBase与MySQL模式下兼容性序

在当今的大数据时代,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面展现出了显著的优势,为企业数据迁移、整合与升级提供了极大的便利。

OceanBase与MySQL的兼容性不仅体现在数据类型、SQL语法等基本面,更深入到了存储引擎、优化器等多个层次。这种高度的兼容性使得企业在不改变原有业务逻辑的情况下,能够轻松地将数据和应用从MySQL迁移到OceanBase,从而享受到OceanBase带来的高性能和可扩展性。

在这里插入图片描述

本文将探讨OceanBase与MySQL模式下的兼容性和OceanBase的MySQL 模式下的 SQL 基本操作。

目录

      • 前言:OceanBase与 MySQL 兼容性对比
        • 数据类型兼容性
        • SQL语法兼容性
        • 存储引擎和分区功能
        • 优化器和执行计划
        • 备份与恢复
      • 1. 创建数据库
        • 1.1 语法
        • 1.2 参数说明
      • 2. 表操作
        • 2.1 创建表
        • 2.2 查看表
        • 2.3 修改表
        • 2.4 删除表
      • 3. 索引操作
        • 3.1 创建索引
        • 3.2 查看索引
        • 3.3 删除索引
      • 4. 插入数据
      • 5. 删除数据
      • 6. 更新数据
      • 7. 查询数据
      • 8. 提交事务
      • 9. 回滚事务

前言:OceanBase与 MySQL 兼容性对比

OceanBase与MySQL模式下的兼容性可以从以下几个方面进行简述:

数据类型兼容性

OceanBase的MySQL模式兼容MySQL 5.7的绝大部分数据类型,包括数值类型(如INT、BIGINT、FLOAT、DOUBLE等)、日期和时间类型(如DATETIME、TIMESTAMP等)、字符串类型(如CHAR、VARCHAR等)以及其他复杂数据类型(如ENUM、SET、JSON等)。此外,OceanBase还支持空间数据类型,这在某些特定应用场景中非常有用。

OceanBase 数据库支持的数据类型有:
数值类型
整数类型:BOOL/BOOLEAN/TINYINT、SMALLINT、MEDIUMINT、INT/INTEGER 和 BIGINT。
定点类型:DECIMAL 和 NUMERIC。
浮点类型:FLOAT 和 DOUBLE。
Bit-Value 类型:BIT。
日期时间类型:DATETIME、TIMESTAMP、DATE、TIME 和 YEAR。
字符类型:CHAR、VARCHAR、BINARY 和 VARBINARY。
大对象类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
文本类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。
枚举类型:ENUM。
集合类型:SET。
JSON 数据类型
空间数据类型

SQL语法兼容性

OceanBase支持MySQL 5.7版本的大部分SQL语法,包括SELECT、INSERT、UPDATE、DELETE等基本操作,以及复杂的SQL查询,如子查询、联接操作、聚合函数等。此外,OceanBase还支持对JSON数据进行查询和操作,提供了丰富的JSON函数。

SELECT
支持大部分查询功能,包括支持单、多表查询;支持子查询;支持内联接、半联接以及外联接;支持分组、聚合;支持常见的概率、线性回归等数据挖掘函数等。
支持对多个 SELECT 查询的结果进行 UNION、UNION ALL、MINUS、EXCEPT 或 INTERSECT 等集合操作。

支持使用 EXPLAIN 语法查看执行计划。

INSERT
支持单行和多行插入数据,同时支持指定分区插入数据。
支持 INSERT INTO … SELECT … 语句。

UPDATE
支持单列和多列更新数据。
支持使用子查询更新数据。
支持集合更新数据。

DELETE
支持单表和多表删除。

TRUNCATE
支持完全清空指定表。

然而,需要注意的是,OceanBase在某些方面与MySQL存在不兼容的情况。例如,OceanBase不支持SELECT…FOR SHARE语法,也不支持部分JSON类型和空间数据类型。此外,在函数支持方面,OceanBase也有一些与MySQL不同的地方。

存储引擎和分区功能

OceanBase本质上是一个基线加增量的存储引擎,采用LSM树(Log-Structured Merge Tree)作为存储机制,这与传统的关系数据库存储引擎有所不同。尽管如此,OceanBase仍然提供了与MySQL相似的分区功能,支持分区表和二级分区,可以完全取代MySQL常用的分库分表方案。

优化器和执行计划

OceanBase的优化器在执行查询时会生成与MySQL相似的执行计划。然而,两者在执行计划的表示和细节上可能存在差异。此外,OceanBase还支持使用EXPLAIN语法查看执行计划,这有助于用户理解和优化查询性能。

备份与恢复

与MySQL相比,OceanBase在备份与恢复方面有所不同。例如,OceanBase不支持冷备份、数据库和表级的备份恢复以及备份数据的有效性验证。因此,在使用OceanBase时需要考虑这些差异并采取相应的措施来确保数据的完整性和可用性。

总的来说,OceanBase在MySQL模式下与MySQL具有较高的兼容性,但仍然存在一些差异和限制。在使用OceanBase时,建议仔细了解其与MySQL的兼容性和差异,并根据实际需求进行相应的调整和优化。
OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和语法。

1. 创建数据库

1.1 语法
CREATE TABLE [IF NOT EXISTS] table_name(table_definition_list) [table_option_list] [partition_option] [AS] select;CREATE TABLE [IF NOT EXISTS] table_nameLIKE table_name;table_definition_list:table_definition [, table_definition ...]table_definition:column_definition| [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc| [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY} [index_name] index_desc| [CONSTRAINT [constraint_name]] FOREIGN KEY [index_name] index_desc REFERENCES reference_definition [match_action][opt_reference_option_list]| [SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part,...)[index_optionn_list] | [CONSTRAINT [constraint_name]] CHECK(expression) constranit_statecolumn_definition_list:column_definition [, column_definition ...]column_definition:column_name data_type[DEFAULT const_value] [AUTO_INCREMENT][NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment| column_name data_type[GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED][opt_generated_column_attribute] index_desc:(column_desc_list) [index_type] [index_option_list]match_action:MATCH {SIMPLE | FULL | PARTIAL}opt_reference_option_list:reference_option [,reference_option ...]reference_option:ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}key_part: {index_col_name [(length)] | (expr)} [ASC | DESC]index_type:USING BTREEindex_option_list:index_option [ index_option ...]index_option:[GLOBAL | LOCAL]| block_size| compression| STORING(column_name_list)| commenttable_option_list:table_option [ table_option ...]table_option:[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name| [DEFAULT] COLLATE [=] collation_name| table_tablegroup| block_size| compression| AUTO_INCREMENT [=] INT_VALUE| comment| ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|DEFAULT| PCTFREE [=] num| parallel_clause| DUPLICATE_SCOPE [=] 'none|cluster'parallel_clause:{NOPARALLEL | PARALLEL integer}partition_option:PARTITION BY HASH(expression)[subpartition_option] PARTITIONS partition_count| PARTITION BY KEY([column_name_list])[subpartition_option] PARTITIONS partition_count| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}[subpartition_option] (range_partition_list)| PARTITION BY LIST {(expression) | COLUMNS (column_name_list)}[subpartition_option] PARTITIONS partition_countsubpartition_option:SUBPARTITION BY HASH(expression)SUBPARTITIONS subpartition_count| SUBPARTITION BY KEY(column_name_list)SUBPARTITIONS subpartition_count| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}(range_subpartition_list)| SUBPARTITION BY LIST(expression)range_partition_list:range_partition [, range_partition ...]range_partition:PARTITION partition_nameVALUES LESS THAN {(expression_list) | MAXVALUE}range_subpartition_list:range_subpartition [, range_subpartition ...]range_subpartition:SUBPARTITION subpartition_nameVALUES LESS THAN {(expression_list) | MAXVALUE}expression_list:expression [, expression ...]column_name_list:column_name [, column_name ...]partition_name_list:partition_name [, partition_name ...]partition_count | subpartition_count:INT_VALUE
1.2 参数说明
参数描述
PRIMARY KEY为创建的表指定主键。如果不指定,则使用隐藏主键。 特别地,OceanBase 数据库不支持修改表的主键或通过 ALTER TABLE 语句为表添加主键,因此推荐您在创建表时指定好表的主键。
FOREIGN KEY为创建的表指定外键。如果不指定外键名,则会使用表名 + OBFK + 创建时间命名。(例如,在 2021 年 8 月 1 日 00:00:00 为 t1 表创建的外键名称为 t1_OBFK_1627747200000000)。
KEY , INDEX为创建的表指定键或索引。 如果不指定索引名,则会使用索引引用的第一列作为索引名,如果命名存在重复,则会使用下划线(_)+ 序号的方式命名。(例如,使用 c1 列创建的索引如果命名重复,则会将索引命名为 c1_2。) 您可以通过 SHOW INDEX
key_part定义所创建的索引。
index_col_name指定索引的列名,每个列名后都支持 ASC(升序),不支持 DESC(降序)。默认为升序。 建立索引的排序方式为:首先以 index_col_name 中第一个列的值排序;该列值相同的记录,按下一列名的值排序;以此类推。
expr表示合法的函数索引表达式,且允许是布尔表达式,例如 c1=c1。OceanBase 数据库当前版本禁止创建生成列上的函数索引。
ROW_FORMAT指定表是否开启 Encoding 存储格式。redundant:不开启 Encoding 存储格式。compact:不开启 Encoding 存储格式。dynamic:Encoding 存储格式。compressed:Encoding 存储格式。default:等价 dynamic 模式。
[GENERATED ALWAYS] AS (expr) [VIRTUAL . STORED]创建生成列,expr 为用于计算列值的表达式。VIRTUAL:列值不会被存储,而是在读取行时,在任何 BEFORE 触发器之后立即计算 。虚拟列不占用存储空间。STORED:在插入或更新行时评估和存储列值。存储列确实需要存储空间并且可以被索引。
BLOCK_SIZE指定表的微块大小。
COMPRESSION指定表的压缩算法,取值如下:none:不使用压缩算法。lz4_1.0: 使用 lz4 压缩算法。zstd_1.0: 使用 zstd 压缩算法。snappy_1.0: 使用 snappy 压缩算法。
CHARSET , CHARACTER SET指定表中列的默认字符集,可使用的字符集请参见 字符集。
COLLATE指定表中列的默认字符序,可使用的字符序请参见 字符序。
table_tablegroup指定表所属的 tablegroup。
AUTO_INCREMENT指定表中自增列的初始值。OceanBase 数据库支持使用自增列作为分区键。
comment注释。
PCTFREE指定宏块保留空间百分比。
parallel_clause指定表级别的并行度:NOPARALLEL:并行度为 1,默认配置PARALLEL integer:指定并行度,integer 取值大于等于 1。DUPLICATE_SCOPE 指定复制表的属性,取值如下:

使用 CREATE DATABASE 语句创建数据库。

示例:创建数据库 db1,指定字符集为 utf8mb4,并创建读写属性。

obclient> CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 READ WRITE;
Query OK, 1 row affected

创建完成后,可以通过 SHOW DATABASES 命令查看当前数据库服务器中所有的数据库。

obclient> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| db1                |
| test               |
+--------------------+
3 rows in set

2. 表操作

在 OceanBase 数据库中,表是最基础的数据存储单元,包含了所有用户可以访问的数据,每个表包含多行记录,每个记录由多个列组成。本节主要提供数据库中表的创建、查看、修改和删除的语法和示例。

2.1 创建表

使用 CREATE TABLE 语句在数据库中创建新表。

示例:在数据库 db1 中创建表 test。

obclient> USE db1;
Database changedobclient> CREATE TABLE test (c1 INT PRIMARY KEY, c2 VARCHAR(3));
Query OK, 0 rows affected

更多 CREATE TABLE 语句相关的语法说明,请参见 CREATE TABLE 章节。

2.2 查看表

使用 SHOW CREATE TABLE 语句查看建表语句。

示例:

查看表 test 的建表语句。

obclient> SHOW CREATE TABLE test\G
*************************** 1. row ***************************Table: test
Create Table: CREATE TABLE `test` (`c1` int(11) NOT NULL,`c2` varchar(3) DEFAULT NULL,PRIMARY KEY (`c1`)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set

使用 SHOW TABLES 语句查看 db1 数据库中的所有表。

obclient> SHOW TABLES FROM db1;
+---------------+
| Tables_in_db1 |
+---------------+
| test          |
+---------------+
1 row in set
2.3 修改表

使用 ALTER TABLE 语句来修改已存在的表的结构,包括修改表及表属性、新增列、修改列及属性、删除列等。

示例:

将表 test 的字段 c2 改名为 c3,并同时修改其字段类型。

obclient> DESCRIBE test;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c1    | int(11)    | NO   | PRI | NULL    |       |
| c2    | varchar(3) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in setobclient> ALTER TABLE test CHANGE COLUMN c2 c3 CHAR(10);
Query OK, 0 rows affectedobclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1    | int(11)  | NO   | PRI | NULL    |       |
| c3    | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set

在表 test 中增加、删除列。

obclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1    | int(11)  | NO   | PRI | NULL    |       |
| c3    | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in setobclient> ALTER TABLE test ADD c4 int;
Query OK, 0 rows affectedobclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1    | int(11)  | NO   | PRI | NULL    |       |
| c3    | char(10) | YES  |     | NULL    |       |
| c4    | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in setobclient> ALTER TABLE test DROP c3;
Query OK, 0 rows affectedobclient> DESCRIBE test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c1    | int(11) | NO   | PRI | NULL    |       |
| c4    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set
2.4 删除表

使用 DROP TABLE 语句删除表。

示例:删除表 test。

obclient> DROP TABLE test;
Query OK, 0 rows affected

3. 索引操作

索引是创建在表上并对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度,降低数据库系统的性能开销。本节主要介绍数据库中索引的创建、查看、删除的语法和示例。

3.1 创建索引

使用 CREATE INDEX 语句创建表的索引。

示例:在表 test 中创建索引。

obclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1    | int(11)  | NO   | PRI | NULL    |       |
| c2    | char(3)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in setobclient> CREATE INDEX test_index ON test (c1, c2);
Query OK, 0 rows affected
3.2 查看索引

使用 SHOW INDEX 语句查看表的索引。

示例:查看表 test 中的索引信息。

obclient> SHOW INDEX FROM test\G
*************************** 1. row ***************************Table: testNon_unique: 0Key_name: PRIMARYSeq_in_index: 1Column_name: c1Collation: ACardinality: NULLSub_part: NULLPacked: NULLNull:Index_type: BTREEComment: available
Index_comment:Visible: YES
*************************** 2. row ***************************Table: testNon_unique: 1Key_name: test_indexSeq_in_index: 1Column_name: c1Collation: ACardinality: NULLSub_part: NULLPacked: NULLNull:Index_type: BTREEComment: available
Index_comment:Visible: YES
*************************** 3. row ***************************Table: testNon_unique: 1Key_name: test_indexSeq_in_index: 2Column_name: c2Collation: ACardinality: NULLSub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment: available
Index_comment:Visible: YES
3 rows in set
3.3 删除索引

使用 DROP INDEX 语句删除表的索引。

示例:删除表 test 中的索引。

obclient> DROP INDEX test_index ON test;
Query OK, 0 rows affected

4. 插入数据

使用 INSERT 语句在已经存在的表中插入数据。

示例:

创建表 t1 并插入一行数据。

obclient> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 int) PARTITION BY KEY(c1) PARTITIONS 4;
Query OK, 0 rows affectedobclient> SELECT * FROM t1;
Empty setobclient> INSERT t1 VALUES(1,1);
Query OK, 1 row affectedobclient> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 |    1 |
+----+------+
1 row in set

向表 t1 中插入多行数据。

obclient> INSERT t1 VALUES(2,2),(3,default),(2+2,3*4);
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 | NULL |
|  4 |   12 |
+----+------+
4 rows in set

更多 INSERT 语句相关的语法,请参见 INSERT 章节。

5. 删除数据

使用 DELETE 语句删除数据,支持单表删除和多表删除数据。

示例:

通过 CREATE TABLE 创建表 t2 和 t3。删除 c1=2 的行,其中 c1 列为表 t2 中的 PRIMARY KEY。

/t3KEY 分区表,且分区名由系统根据分区命令规则自动生成,即分区名为 p0p1p2p3/

obclient> CREATE TABLE t2(c1 INT PRIMARY KEY, c2 INT);
Query OK, 0 rows affectedobclient> INSERT t2 VALUES(1,1),(2,2),(3,3),(5,5);
Query OK, 4 rows affected
Records: 4  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t2;
+----+------+
| c1 | c2   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  5 |    5 |
+----+------+
4 rows in setobclient> CREATE TABLE t3(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;
Query OK, 0 rows affectedobclient> INSERT INTO t3 VALUES(5,5),(1,1),(2,2),(3,3);
Query OK, 4 rows affected
Records: 4  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t3;
+----+------+
| c1 | c2   |
+----+------+
|  5 |    5 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
4 rows in setobclient> DELETE FROM t2 WHERE c1 = 2;
Query OK, 1 row affectedobclient> SELECT * FROM t2;
+----+------+
| c1 | c2   |
+----+------+
|  1 |    1 |
|  3 |    3 |
|  5 |    5 |
+----+------+
3 rows in set

删除表 t2 中按照 c2 列排序之后的第一行数据。

obclient> DELETE FROM t2 ORDER BY c2 LIMIT 1;
Query OK, 1 row affectedobclient> SELECT * FROM t2;
+----+------+
| c1 | c2   |
+----+------+
|  3 |    3 |
|  5 |    5 |
+----+------+
2 rows in set

删除表 t3 的 p2 分区的数据。

obclient> SELECT * FROM t3 PARTITION(p2); 
+----+------+
| c1 | c2   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
3 rows in setobclient> DELETE FROM t3 PARTITION(p2); 
Query OK, 3 rows affectedobclient> SELECT * FROM t3;
+----+------+
| c1 | c2   | 
+----+------+
|  5 |    5 |
+----+------+
1 row in set

删除 t2、t3 表中 t2.c1 = t3.c1 的数据。

obclient> SELECT * FROM t2;
+----+------+
| c1 | c2   |
+----+------+
|  3 |    3 |
|  5 |    5 |
+----+------+
2 rows in setobclient> SELECT * FROM t3;
+----+------+
| c1 | c2   | 
+----+------+
|  5 |    5 |
+----+------+obclient> DELETE t2, t3 FROM t2, t3 WHERE t2.c1 = t3.c1;
Query OK, 3 rows affected/*等价于
obclient> DELETE FROM t2, t3 USING t2, t3 WHERE t2.c1 = t3.c1;
*/obclient> SELECT * FROM t2;
+----+------+
| c1 | c2   |
+----+------+
|  3 |    3 |
+----+------+
1 row in setobclient> SELECT * FROM t3;
Empty set

6. 更新数据

使用 UPDATE 语句修改表中的字段值。

示例:

通过 CREATE TABLE 创建表 t4 和 t5,将表 t4 中 t4.c1=10 对应的那一行数据的 c2 列值修改为 100。

obclient> CREATE TABLE t4(c1 INT PRIMARY KEY, c2 INT);
Query OK, 0 rows affectedobclient> INSERT t4 VALUES(10,10),(20,20),(30,30),(40,40);
Query OK, 4 rows affected
Records: 4  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t4;
+----+------+
| c1 | c2   |
+----+------+
| 10 |   10 |
| 20 |   20 |
| 30 |   30 |
| 40 |   40 |
+----+------+
4 rows in setobclient> CREATE TABLE t5(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;
Query OK, 0 rows affectedobclient> INSERT t5 VALUES(50,50),(10,10),(20,20),(30,30);
Query OK, 4 rows affected
Records: 4  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t5;
+----+------+
| c1 | c2   |
+----+------+
| 20 |   20 |
| 10 |   10 |
| 50 |   50 |
| 30 |   30 |
+----+------+
4 rows in setobclient> UPDATE t4 SET t4.c2 = 100 WHERE t4.c1 = 10;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0obclient> SELECT * FROM t4;
+----+------+
| c1 | c2   |
+----+------+
| 10 |  100 |
| 20 |   20 |
| 30 |   30 |
| 40 |   40 |
+----+------+
4 rows in set

将表 t4 中按照 c2 列排序的前两行数据的 c2 列值修改为 100。

obclient> UPDATE t4 set t4.c2 = 100 ORDER BY c2 LIMIT 2;
Query OK, 2 rows affected
Rows matched: 2  Changed: 2  Warnings: 0obclient> SELECT * FROM t4;
+----+------+
| c1 | c2   |
+----+------+
| 10 |  100 |
| 20 |  100 |
| 30 |  100 |
| 40 |   40 |
+----+------+
4 rows in set

将表 t5 中 p1 分区的数据中 t5.c1 > 20 的对应行数据的 c2 列值修改为 100。

obclient> SELECT * FROM t5 PARTITION (p1);
+----+------+
| c1 | c2   |
+----+------+
| 10 |   10 |
| 50 |   50 |
+----+------+
2 rows in setobclient> UPDATE t5 PARTITION(p1) SET t5.c2 = 100 WHERE t5.c1 > 20;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0obclient> SELECT * FROM t5 PARTITION(p1);
+----+------+
| c1 | c2   |
+----+------+
| 10 |   10 |
| 50 |  100 |
+----+------+
2 rows in set

对于表 t4 和表 t5 中满足 t4.c2 = t5.c2 对应行的数据,将表 t4 中的 c2 列值修改为 100,表 t5 中的 c2 列值修改为 200。

obclient> UPDATE t4,t5 SET t4.c2 = 100, t5.c2 = 200 WHERE t4.c2 = t5.c2;
Query OK, 1 row affected 
Rows matched: 4  Changed: 1  Warnings: 0obclient> SELECT * FROM t4;
+----+------+
| c1 | c2   |
+----+------+
| 10 |  100 |
| 20 |  100 |
| 30 |  100 |
| 40 |   40 |
+----+------+
4 rows in setobclient> SELECT * FROM t5;
+----+------+
| c1 | c2   |
+----+------+
| 20 |   20 |
| 10 |   10 |
| 50 |  200 |
| 30 |   30 |
+----+------+
4 rows in set

7. 查询数据

使用 SELECT 语句查询表中的内容。

示例:

通过 CREATE TABLE 创建表 t6。从表 t6 中读取 name 的数据。

obclient> CREATE TABLE t6 (id INT, name VARCHAR(50), num INT);
Query OK, 0 rows affectedobclient> INSERT INTO t6 VALUES(1,'a',100),(2,'b',200),(3,'a',50);
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t6;
+------+------+------+
| ID   | NAME | NUM  |
+------+------+------+
|    1 | a    |  100 |
|    2 | b    |  200 |
|    3 | a    |   50 |
+------+------+------+
3 rows in setobclient> SELECT name FROM t6;
+------+
| NAME |
+------+
| a    |
| b    |
| a    |
+------+
3 rows in set

在查询结果中对 name 进行去重处理。

obclient> SELECT DISTINCT name FROM t6;
+------+
| NAME |
+------+
| a    |
| b    |
+------+
2 rows in set

从表 t6 中根据筛选条件 name = ‘a’ ,输出对应的 id 、name 和 num。

obclient> SELECT id, name, num FROM t6 WHERE name = 'a';
+------+------+------+
| ID   | NAME | NUM  |
+------+------+------+
|    1 | a    |  100 |
|    3 | a    |   50 |
+------+------+------+
2 rows in set

8. 提交事务

使用 COMMIT 语句提交事务。

在提交事务(COMMIT)之前:

  • 您的修改只对当前会话可见,对其他数据库会话均不可见。
  • 您的修改没有持久化,您可以通过 ROLLBACK 语句撤销修改。

在提交事务(COMMIT)之后:

  • 您的修改对所有数据库会话可见。
  • 您的修改持久化成功,不能通过 ROLLBACK 语句回滚修改。

示例:通过 CREATE TABLE 创建表 t_insert。使用 COMMIT 语句提交事务。

obclient> BEGIN;
Query OK, 0 rows affectedobclient> CREATE TABLE t_insert(id number NOT NULL PRIMARY KEY,name varchar(10) NOT NULL, value number,gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affectedobclient> INSERT INTO t_insert(id, name, value, gmt_create) VALUES(1,'CN',10001, current_timestamp),(2,'US',10002, current_timestamp),(3,'EN',10003, current_timestamp);
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-08-22 16:19:26 |
|  2 | US   | 10002 | 2022-08-22 16:19:26 |
|  3 | EN   | 10003 | 2022-08-22 16:19:26 |
+----+------+-------+---------------------+
3 rows in setobclient> INSERT INTO t_insert(id,name) VALUES(4,'JP');
Query OK, 1 row affectedobclient> COMMIT;
Query OK, 0 rows affectedobclient> exit;
Byeobclient> obclient -h127.0.0.1 -ur**t@mysql -P2881 -p****** -Ddb1obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-08-22 16:19:26 |
|  2 | US   | 10002 | 2022-08-22 16:19:26 |
|  3 | EN   | 10003 | 2022-08-22 16:19:26 |
|  4 | JP   |  NULL | 2022-08-22 16:21:39 |
+----+------+-------+---------------------+
4 rows in set

9. 回滚事务

使用 ROLLBACK 语句回滚事务。

回滚一个事务指将事务的修改全部撤销。可以回滚当前整个未提交的事务,也可以回滚到事务中任意一个保存点。如果要回滚到某个保存点,必须结合使用 ROLLBACK 和 TO SAVEPOINT 语句。 其中:

如果回滚整个事务,则:

  • 事务会结束

  • 所有的修改会被丢弃

  • 清除所有保存点

  • 释放事务持有的所有锁
    如果回滚到某个保存点,则:

  • 事务不会结束

  • 保存点之前的修改被保留,保存点之后的修改被丢弃

  • 清除保存点之后的保存点(不包括保存点自身)

  • 释放保存点之后事务持有的所有锁

示例:回滚事务的全部修改。

obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-08-22 16:19:26 |
|  2 | US   | 10002 | 2022-08-22 16:19:26 |
|  3 | EN   | 10003 | 2022-08-22 16:19:26 |
+----+------+-------+---------------------+
3 rows in setobclient> BEGIN;
Query OK, 0 rows affectedobclient> INSERT INTO t_insert(id, name, value) VALUES(4,'JP',10004),(5,'FR',10005),(6,'RU',10006);
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-08-22 16:19:26 |
|  2 | US   | 10002 | 2022-08-22 16:19:26 |
|  3 | EN   | 10003 | 2022-08-22 16:19:26 |
|  4 | JP   | 10004 | 2022-08-22 16:26:23 |
|  5 | FR   | 10005 | 2022-08-22 16:26:23 |
|  6 | RU   | 10006 | 2022-08-22 16:26:23 |
+----+------+-------+---------------------+
6 rows in setobclient> ROLLBACK;
Query OK, 0 rows affected+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-08-22 16:19:26 |
|  2 | US   | 10002 | 2022-08-22 16:19:26 |
|  3 | EN   | 10003 | 2022-08-22 16:19:26 |
+----+------+-------+---------------------+
3 rows in set

听说...关注下面公众号的人都变牛了,纯技术,纯干货 !

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

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

相关文章

【SpringBoot】数据脱敏

文章目录 什么是数据脱敏JsonSerialize自定义Jackson注解定制脱敏策略定制JSON序列化实现脱敏工具类 定义Person类,对其数据脱敏模拟接口测试总结 什么是数据脱敏 数据脱敏,也称为数据的去隐私化或数据变形,是一种技术手段,用于对…

【问题实操】银河高级服务器操作系统实例分享,配置hugepages启动异常

1.问题现象 某运营商国产服务器操作系统项目,部署Kylin-Server-0524-aarch64服务器系统,内核从4.19.90-24.4升级到4.19.90-25.14。在grub中配置huagepages大页内存后,系统在内核启动阶段黑屏,只显示一个光标。grub配置如下图&…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…

Gone框架介绍3 - 使用gone命令,自动生成Priest函数

文章目录 1. 安装辅助工具: gone2. 创建一个名为gen-code的新项目3. 创建Goner4. 使用辅助工具5. 添加main函数 我在两年前实现了一个Golang的依赖注入框架,并且集成了gin、xorm、redis、cron、消息中间件等功能,自己觉得还挺好用的;之前一直…

Unity射击游戏开发教程:(8)构建 UI 元素:添加分数显示

用户界面决定用户如何与屏幕交互。UI 适用于所有类型的游戏和应用程序,在此示例中,我们将为我的太空射击游戏设置一个简单的记分板。 第一步是在层次结构中创建一个 UI 元素。只需在层次结构中右键单击,滚动 UI 并选择要添加的 UI 元素类型。在本例中,我们将使用文本元素。…

使用 Docker 自建一款怀旧游戏之 - 扫雷

1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷。每个方块上都标有数字,表示周围 8 个方块中…

Java网址url工具类

功能描述 无需引入三方依赖文本匹配网址(支持多个)网址解析(包括协议、主机、路径、参数等) package com.qiangesoft.image.utils;import org.springframework.util.Assert; import org.springframework.util.CollectionUtils;i…

行为学学习记忆实验和抗焦虑实验两款硬件

安徽耀坤XWX-BM八臂迷宫实验(Eight-arm Maze Test,RMT)由八个完全相同的臂组成,这些臂从一个中央平台放射出来,所以又被称为放射迷宫。其基本方式是:训练动物受食物的驱使对迷宫的各臂进行探究,…

xLua背包实践

准备工作 环境,代码 在C#代码方面我们需要准备单例模式基类,AB包管理器,lua解析器管理器 详情请见AB包管理器 xlua详解 然后是Xlua包和AB包,具体导入方法也在上面的链接中 然后是lua的三个文件 具体代码: JsonUtil…

SSH Config 后门 | Linux 后门系列

ssh 客户端配置文件加载顺序 命令行参数 > ~/.ssh/config > /etc/ssh/ssh_config Ubuntu server 16.04 默认 /etc/ssh/ssh_config # Host * # ForwardAgent no # ForwardX11 no # RhostsRSAAuthentication no # RSAAuthentication …

一、OSPF基础

目录 1.路由协议的优先级 2.转发原则:最长匹配原则 3.负载分担 4.路由备份(浮动路由) 5.路由协议的分类 6.动态路由 7.距离矢量路由协议(BGP,RIP) 8.链路状态路由协议(OSPF,I…

SpringBoot配置HTTPS及开发调试

前言 在实际开发过程中,如果后端需要启用https访问,通常项目启动后配置nginx代理再配置https,前端调用时高版本的chrome还会因为证书未信任导致调用失败,通过摸索整理一套开发调试下的https方案,特此分享 后端配置 …

西瓜书学习——决策树形状、熵和决策树的本质

文章目录 决策树形状监督学习算法分类与回归 熵信息熵香农熵 (Shannon Entropy) - H(X)联合熵 (Joint Entropy) - H(X, Y)条件熵 (Conditional Entropy) - H(Y|X)互信息 (Mutual Information) - I(X; Y)相对熵 (Relative Entropy) / KL散度 (Kullback-Leibler Divergence) - DK…

misc学习

一.知识点 1.BMP文件 BMP文件主要有四部分组成,位图头、位图信息、调色板、位图数据。 bmp文件头(bmp file header):提供文件的格式、大小等信息 位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息…

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

Sora新突破!AI生成电影迈向新阶段,配音版Sora登场!将如何改变影视行业?

Sora之后迎来新突破&#xff01; 配音版Sora来袭&#xff0c;AI生成电影又更近一步&#xff01; 在2024年伊始&#xff0c;人工智能界迎来了一次创新性的突破&#xff0c;由AI语音技术的先锋公司ElevenLabs带头实现。他们最近的成就体现在为OpenAI的Sora视频模型提供了令人动容…

tiktok如何影响用户行为的分析兼论快速数据分析的策略

tiktok如何影响用户行为的分析 快速数据分析的策略流程&#xff1a; 1.确定指标变量&#xff0c;也就确定了数据分析想要回答的问题。想回答不同的问题&#xff0c;就选择不同的指标变量。 变量筛选方法选出指标变量相关的变量&#xff1b; 针对筛选出的变量进行描述性分析和因…

【网站项目】家庭理财系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

金三银四面试题(二十三):装饰器模式知多少?

什么是装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许动态地向对象添加新的行为&#xff0c;而无需修改原始对象的结构。通过将对象包装在一个或多个装饰器对象中&#xff0c;装饰器模式可以增强原始对象的功能。 装…

Python俄罗斯方块

文章目录 游戏实现思路1. 游戏元素的定义2. 游戏区域和状态的定义3. 游戏逻辑的实现4. 游戏界面的绘制5. 游戏事件的处理6. 游戏循环7. 完整实现代码 游戏实现思路 这个游戏的实现思路主要分为以下几个步骤&#xff1a; 1. 游戏元素的定义 Brick类&#xff1a;表示游戏中的砖…