slug: /zh/sql-reference/table-functions/mysql
mysql {#mysql}
允许对存储在远程MySQL服务器上的数据执行SELECT和INSERT查询。
语法
mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);
参数
host:port— MySQL服务器地址.database— 远程数据库名称.table— 远程表名称.user— MySQL用户.password— 用户密码.replace_query— 将INSERT INTO查询转换为REPLACE INTO的标志。如果replace_query=1`,查询被替换。on_duplicate_clause— 添加ON DUPLICATE KEY on_duplicate_clause表达式到INSERT查询。明确规定只能使用replace_query = 0,如果你同时设置replace_query = 1和on_duplicate_clause`,ClickHouse将产生异常。示例:
INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1on_duplicate_clause这里是UPDATE c2 = c2 + 1。请查阅MySQL文档,来找到可以和ON DUPLICATE KEY一起使用的on_duplicate_clause子句。
简单的 WHERE 子句如 =, !=, >, >=, <, <= 将即时在MySQL服务器上执行。其余的条件和 LIMIT 只有在对MySQL的查询完成后,才会在ClickHouse中执行采样约束。
支持使用|并列进行多副本查询,示例如下:
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
或
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
返回值
与原始MySQL表具有相同列的表对象。
!!! note “注意”
在INSERT查询中为了区分mysql(...)与带有列名列表的表名的表函数,你必须使用关键字FUNCTION或TABLE FUNCTION。查看如下示例。
用法示例 {#usage-example}
MySQL中的表:
mysql> CREATE TABLE `test`.`test` (-> `int_id` INT NOT NULL AUTO_INCREMENT,-> `int_nullable` INT NULL DEFAULT NULL,-> `float` FLOAT NOT NULL,-> `float_nullable` FLOAT NULL DEFAULT NULL,-> PRIMARY KEY (`int_id`));Query OK, 0 rows affected (0,09 sec)mysql> insert into test (`int_id`, `float`) VALUES (1,2);Query OK, 1 row affected (0,00 sec)mysql> select * from test;+------+----------+-----+----------+| int_id | int_nullable | float | float_nullable |+------+----------+-----+----------+| 1 | NULL | 2 | NULL |+------+----------+-----+----------+1 row in set (0,00 sec)
从ClickHouse中查询数据:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123')
┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐│ 1 │ ᴺᵁᴸᴸ │ 2 │ ᴺᵁᴸᴸ │└────────┴──────────────┴───────┴────────────────┘
替换和插入:
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3);INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4);SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
┌─int_id─┬─float─┐│ 1 │ 3 ││ 2 │ 4 │└────────┴───────┘
