目录
1. 数据导入insert
- 1. 数据导入insert
- 2. 数据删除delete
Insert Into命令包含以下两种。其中with label是可选的,默认会自动生成
- insert into tb with label label_name select …;
- insert into tb with label label_name (col1, col2, …) values (…), (…), …;:不建议用于生产环境
示例:
mysql> insert into person with label person_label (id, name, age) values(1, 'name1', 11);
Query OK, 1 row affected (0.15 sec)
{'label':'person_label', 'status':'VISIBLE', 'txnId':'2016'}
mysql>
- 如果有warnings,表示被过滤的行数。查看被过滤的行使用
show load where label = "person_label";
- 查看insert的数据可见状态使用
show transaction where id = 2016;
- 查看同一会话最近一次insert操作的结果使用
show last insert;
。有的语言的客户端能获取到,有的语言的客户端获取不到
delete是一个同步的操作。需要指定表、分区、删除的条件来筛选要删除的数据,并将会同时删除base表和rollup表的数据
语法:
DELETE FROM table_name [PARTITION partition_name | PARTITIONS (p1, p2)]
WHERE
column_name1 op { value | value_list } [ AND column_name2 op { value | value_list } ...];
注意事项:
- 如果是单分区表,删除时可以不指定分区。如果是多分区表,删除时必须指定分区;如果delete_without_partition会话变量为true,删除时可以不指定分区,表示将删除应用到所有分区
- where后面的条件谓词只能针对Key列,并且谓词之间,只能通过AND连接
- delete是一种逻辑删除,会产生一个新的数据版本。查询时会对删除的数据进行过滤,所以会影响查询性能。所以不要频繁的进行delete
- 数据的真正删除是在BE进行数据Compaction时进行的
- 执行delete命令时对应的表,不能有正在进行的导入任务(包括pending、ETL、loading)
示例:
mysql> delete from person partition beijing where id = 1;
Query OK, 0 rows affected (0.48 sec)
{'label':'delete_a70a7a1f-06ca-4e00-a2e7-206ed159356a', 'status':'VISIBLE', 'txnId':'2003'}
mysql>
说明如下:
- 因为delete是逻辑删除,所以永远是0 rows affected
- 有时delete操作提交完成,但还未发布版本变成VISIBLE,超过一定时间也会返回结果,此时status为COMMITTED
查看数据库的delete状态
mysql> show delete from test_db;
+-----------+----------------+---------------------+-----------------+----------+
| TableName | PartitionName | CreateTime | DeleteCondition | State |
+-----------+----------------+---------------------+-----------------+----------+
| person | beijing | 2022-08-03 15:53:36 | id EQ "1" | FINISHED |
+-----------+----------------+---------------------+-----------------+----------+
1 rows in set (0.08 sec)
mysql>