Clickhouse对表操作分为四大类:增删查改(INSERT,DROP,SELECT,ALTER)。
增,删,查比较简单,改最复杂。那具体有哪些改的操作呢?如下清单:
-
ALTER TABLEALTER UPDATEALTER DELETE-
ALTER COLUMNALTER ADD COLUMNALTER DROP COLUMNALTER MODIFY COLUMNALTER COMMENT COLUMNALTER CLEAR COLUMNALTER RENAME COLUMN
-
ALTER INDEXALTER ORDER BYALTER SAMPLE BYALTER ADD INDEXALTER DROP INDEXALTER MATERIALIZE INDEXALTER CLEAR INDEX
-
ALTER CONSTRAINTALTER ADD CONSTRAINTALTER DROP CONSTRAINT
ALTER TTLALTER MATERIALIZE TTLALTER SETTINGSALTER MOVE PARTITIONALTER FETCH PARTITIONALTER FREEZE PARTITION
-
ALTER VIEWALTER VIEW REFRESHALTER VIEW MODIFY QUERY
下面以MergeTree引擎表为例,对应列表操作:
一: 建表并插入测试数据
# 创建表 #方式1 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = engine #方式2 CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine] #方式3 CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
# 创建测试表 CREATE TABLE table_test1 ( UserID UInt32, UserAccount String, CreateDate Date, CreateDatetime Datetime, Comment Nullable(String) ) ENGINE = MergeTree() ORDER BY (UserID, CreateDate) PRIMARY KEY (UserID) SETTINGS index_granularity=8192;
导入数据
# 插入表 #方式1-交互式 INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), ... INSERT INTO [db.]table [(c1, c2, c3)] SELECT ... #方式2-批量 cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV" #方式3-http客户端 echo -ne '10\n11\n12\n' | POST 'http://localhost:8123/?query=INSERT INTO t FORMAT TabSeparated'
导出数据
方式一:交互式 select * from tableName into outfile 'path/file' 方式二:非交互式 clickhouse-client --database bdName -u default --password password --query='select * from tableName' > abc 方式二:http客户端 echo 'select 1 FORMAT TabSeparated' | curl "http://user:password@localhost:8123/" -d @- > file
# 插入数据 INSERT INTO table_test1(UserID,UserAccount,CreateDate,CreateDatetime,Comment) VALUES (100001,'zhangsan',toDate(NOW()),NOW(),'Comment'); INSERT INTO table_test1(UserID,UserAccount,CreateDate,CreateDatetime,Comment) VALUES (100002,'lisi',toDate(NOW()),NOW(),'Comment'); INSERT INTO table_test1(UserID,UserAccount,CreateDate,CreateDatetime,Comment) VALUES (100003,'wangwu',toDate(NOW()),NOW(),'Comment'); INSERT INTO table_test1(UserID,UserAccount,CreateDate,CreateDatetime,Comment) VALUES (100004,'zhaoliu',toDate(NOW()),NOW(),'Comment'); INSERT INTO table_test1(UserID,UserAccount,CreateDate,CreateDatetime,Comment) VALUES (100001,'zhangsan2',toDate(NOW()),NOW(),'Comment'); INSERT INTO table_test1(UserID,UserAccount,CreateDate,CreateDatetime,Comment) VALUES (100002,'lisi2',toDate(NOW()),NOW(),''); INSERT INTO table_test1(UserID,UserAccount,CreateDate,CreateDatetime) VALUES (100003,'wangwu2',toDate(NOW()),NOW());
# 查询表 SELECT [DISTINCT] expr_list [FROM [db.]table | (subquery) | table_function] [FINAL] [SAMPLE sample_coeff] [ARRAY JOIN ...] [GLOBAL] ANY|ALL INNER|LEFT JOIN (subquery)|table USING columns_list [PREWHERE expr] [WHERE expr] [GROUP BY expr_list] [WITH TOTALS] [HAVING expr] [ORDER BY expr_list] [LIMIT [n, ]m] [UNION ALL ...] [INTO OUTFILE filename] [FORMAT format] [LIMIT n BY columns]
# 查看数据 centf8118.sharding1.db :) SELECT * FROM table_test1; SELECT * FROM table_test1 ┌─UserID─┬─UserAccount─┬─CreateDate─┬──────CreateDatetime─┬─Comment─┐ │ 100003 │ wangwu2 │ 2020-09-02 │ 2020-09-02 16:45:57 │ ᴺᵁᴸᴸ │ └────────┴─────────────┴────────────┴─────────────────────┴─────────┘ ┌─UserID─┬─UserAccount─┬─CreateDate─┬──────CreateDatetime─┬─Comment─┐ │ 100001 │ zhangsan │ 2020-09-02 │ 2020-09-02 16:45:55 │ Comment │ │ 100001 │ zhangsan2 │ 2020-09-02 │ 2020-09-02 16:45:56 │ Comment │ │ 100002 │ lisi │ 2020-09-02 │ 2020-09-02 16:45:55 │ Comment │ │ 100002 │ lisi2 │ 2020-09-02 │ 2020-09-02 16:45:56 │ │ │ 100003 │ wangwu │ 2020-09-02 │ 2020-09-02 16:45:55 │ Comment │ │ 100004 │ zhaoliu │ 2020-09-02 │ 2020-09-02 16:45:56 │ Comment │ └────────┴─────────────┴────────────┴─────────────────────┴─────────┘ 7 rows in set. Elapsed: 0.005 sec.
二:更新表数据
ALTER TABLE table_test1 UPDATE UserAccount = 'NEW ACCOUNT' WHERE UserID = 100001 AND UserAccount = 'zhangsan';
centf8118.sharding1.db :) ALTER TABLE table_test1 UPDATE UserAccount = 'NEW ACCOUNT' WHERE UserID = 100001 AND UserAccount = 'zhangsan'; ALTER TABLE table_test1 UPDATE UserAccount = 'NEW ACCOUNT' WHERE (UserID = 100001) AND (UserAccount = 'zhangsan') Ok. 0 rows in set. Elapsed: 0.004 sec. centf8118.sharding1.db :) SELECT * FROM table_test1; SELECT * FROM table_test1 ┌─UserID─┬─UserAccount─┬─CreateDate─┬──────CreateDatetime─┬─Comment─┐ │ 100003 │ wangwu2 │ 2020-09-02 │ 2020-09-02 16:45:57 │ ᴺᵁᴸᴸ │ └────────┴─────────────┴────────────┴─────────────────────┴─────────┘ ┌─UserID─┬─UserAccount─┬─CreateDate─┬──────CreateDatetime─┬─Comment─┐ │ 100001 │ NEW ACCOUNT │ 2020-09-02 │ 2020-09-02 16:45:55 │ Comment │ │ 100001 │ zhangsan2 │ 2020-09-02 │ 2020-09-02 16:45:56 │ Comment │ │ 100002 │ lisi │ 2020-09-02 │ 2020-09-02 16:45:55 │ Comment │ │ 100002 │ lisi2 │ 2020-09-02 │ 2020-09-02 16:45:56 │ │ │ 100003 │ wangwu │ 2020-09-02 │ 2020-09-02 16:45:55 │ Comment │ │ 100004 │ zhaoliu │ 2020-09-02 │ 2020-09-02 16:45:56 │ Comment │ └────────┴─────────────┴────────────┴─────────────────────┴─────────┘ 7 rows in set. Elapsed: 0.005 sec.