在建表时设置主键,LAS 表可支持行级别的数据更新和删除操作,且支持 ACID 属性。
ACID 代表数据库事务的四个特征:
原子性:操作完全成功或失败,它不会留下部分数据。
一致性:一旦应用程序执行操作,该操作的结果在每个后续操作中都对其可见。
隔离性:一个用户的不完整操作不会给其他用户带来意想不到的副作用。
持久性:一旦操作完成,即使面对机器或系统故障,它也会被保留。
需要注意的是,如果多个任务并发写入 ACID 表并存在写入冲突后,会存在写入失败或数据异常问题。
点击新建表,除填写必要字段信息外,需勾选部分字段为主键列,以支持行级别的 ACID 能力。
通过 DDL 语句建表时,用户需使用 PRIMARY KEY
关键字指定主键,以支持行级别的 ACID 能力,例如:
USE test_db; CREATE TABLE test_table ( `name` STRING PRIMARY KEY, `age` INT, `city` STRING );
如需复合主键,可使用 PRIMARY KEY (col_a, col_b)
语法进行指定,例如:
USE test_db; CREATE TABLE test_table ( `name` STRING, `age` INT, `city` STRING, PRIMARY KEY (name, age) );
需要注意的是,目前主键类型仅支持基本的 string,int,bigint,double 这几种类型,如果设置其它类型作为主键,会在数据插入时产生预期之外的问题。
Insert Overwrite:适用于首次导入全量数据场景,会覆盖历史数据,相对 Insert Into 写入性能更高(BulkInsert)。 注:对于 ACID 表,insert overwrite 引擎不会做去重,需要由业务侧增加去重逻辑。
Insert Into:可以保证去重
对于设置了主键的表,若插入多条相同主键的记录,最终仅保留最新的数据,例如:
USE test_db; -- CREATE TABLE test_table -- ( -- `name` STRING, -- `age` INT, -- `city` STRING, -- PRIMARY KEY (name, age) -- ); INSERT INTO test_table VALUES ('Jack', 17, 'Macau'), ('Jack', 17, 'Shanghai'), ('Nico', 19, 'NYC');
+-------+------+-----------+--+ | name | age | city | +-------+------+-----------+--+ | Jack | 17 | Shanghai | | Nico | 19 | NYC | +-------+------+-----------+--+
支持 UPDATE 操作,例如:
USE test_db; UPDATE test_table SET city = 'Beijing' WHERE city = 'Shanghai'
+-------+------+-----------+--+ | name | age | city | +-------+------+-----------+--+ | Jack | 17 | Beijing | | Nico | 19 | NYC | +-------+------+-----------+--+
支持 DELETE 操作,例如:
DELETE FROM test_table WHERE city = 'NYC'
+-------+------+-----------+--+ | name | age | city | +-------+------+-----------+--+ | Jack | 17 | Beijing | +-------+------+-----------+--+