RENAME 语句可用于重命名数据库、表或字典,支持在单个查询中重命名多个实体。
注意
具有多个实体的RENAME查询是非原子操作。
重命名数据库。
RENAME DATABASE [databaseIdentifier] TO [databaseIdentifier2] [,...]
-- 1. 创建库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 删除现存表 DROP TABLE IF EXISTS sample_db.sample_table ON CLUSTER sample_cluster; -- 3. 创建表 CREATE TABLE IF NOT EXISTS sample_db.sample_table ON CLUSTER sample_cluster ( id UInt32, name String DEFAULT '', CONSTRAINT constraint1 CHECK id > 10 ) ENGINE=MergeTree ORDER BY id; -- 4. 若目标数据库 sample1 已存在,则先删除,避免重命名冲突 DROP database IF EXISTS sample_db1; -- 5. 将数据库 sample 重命名为 sample_db1 RENAME DATABASE sample_db to sample_db1; -- 6. 将 sample1 库中的表 sample_db1.sample_table 重命名为 sample_db1.sample_table1 RENAME TABLE sample_db1.sample_table to sample_db1.sample_table1;
重命名一个或多个表。
重命名表是一个轻量级的操作。 如果在 TO 子句中指定了不同的数据库名称,该表将被移动到目标数据库。但是源数据库和目标数据库的存储目录必须位于同一文件系统中,否则操作将失败并返回错误。
当在一个 RENAME TABLE 语句中同时重命名多个表时,该操作不是原子性的。操作可能部分成功。如果操作在执行过程中中断,只有部分表会被成功重命名/移动。在其他会话查询正在被重命名的表时,可能会遇到 Table ... does not exist ... 或类似错误,直到所有重命名操作完成。
RENAME TABLE [tableIdentifier] TO [tableIdentifier], [tableIdentifier] TO [tableIdentifier];
-- 1. 创建库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 删除现存表 DROP TABLE IF EXISTS sample_db.sample_table ON CLUSTER sample_cluster; -- 3. 创建表 CREATE TABLE sample_db.sample_table ON CLUSTER sample_cluster ( `a` Int8, `b` String, `c` Date ) ENGINE = `MergeTree` ORDER BY (`a`) -- 4. 将 sample 库中的表 sample_db.sample_table 重命名为 sample_db.new_sample_table RENAME TABLE sample_db.sample_table to sample_db.new_sample_table
重命名一个或多个字典。 此查询可用于在数据库之间移动字典。
RENAME DICTIONARY [databaseIdentifier.]dict_name TO [databaseIdentifier.]dict_name [, ...];
单个字典重命名
将 db0 数据库中的字典 dict_A 重命名为 db1 数据库中的 dict_B:
-- 1. 创建库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 创建字典 CREATE DICTIONARY IF NOT EXISTS sample_db.sample_dict ON CLUSTER sample_cluster ( `user_id` UInt64, `username` String, `age` UInt8 DEFAULT 0, `gender` UInt8 DEFAULT 0, `last_login` DateTime ) PRIMARY KEY user_id SOURCE(MySQL( host 'mysql_host.example.com' port 3306 user 'dict_reader' password 'secure_password' db 'user_db' table 'users' )) LAYOUT(FLAT()) LIFETIME(MIN 300 MAX 900); -- 3. 若目标字典 new_sample_dict 已存在,则先删除,避免重命名冲突 DROP DICTIONARY IF EXISTS sample_db.new_sample_dict; -- 4. 重命名字典 RENAME DICTIONARY sample_db.sample_dict TO sample_db.new_sample_dict;
多个字典重命名
将 db0 中的 dict_A 重命名为 db1.dict_B,同时将 db2 中的 dict_C 重命名为 db2.dict_D:
-- 1. 创建库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 创建字典 1 CREATE DICTIONARY IF NOT EXISTS sample_db.sample_dict1 ON CLUSTER sample_cluster ( `user_id` UInt64, `username` String, `age` UInt8 DEFAULT 0, `gender` UInt8 DEFAULT 0, `last_login` DateTime ) PRIMARY KEY user_id SOURCE(MySQL( host 'mysql_host.example.com' port 3306 user 'dict_reader' password 'secure_password' db 'user_db' table 'users' )) LAYOUT(FLAT()) LIFETIME(MIN 300 MAX 900); -- 3. 创建字典 2 CREATE DICTIONARY IF NOT EXISTS sample_db.sample_dict2 ON CLUSTER sample_cluster ( `user_id` UInt64, `username` String, `age` UInt8 DEFAULT 0, `gender` UInt8 DEFAULT 0, `last_login` DateTime ) PRIMARY KEY user_id SOURCE(MySQL( host 'mysql_host.example.com' port 3306 user 'dict_reader' password 'secure_password' db 'user_db' table 'users' )) LAYOUT(FLAT()) LIFETIME(MIN 300 MAX 900); -- 4. 若目标字典 new_sample_dict 已存在,则先删除,避免重命名冲突 DROP DICTIONARY IF EXISTS sample_db.new_sample_dict1; DROP DICTIONARY IF EXISTS sample_db.new_sample_dict2; -- 5. 重命名多个字典 RENAME DICTIONARY sample_db.sample_dict1 TO sample_db.new_sample_dict1, sample_db.sample_dict2 TO sample_db.new_sample_dict2;