# MySQL

允许在远程MySQL服务器上执行SELECTINSERT查询。

# 语法

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的标志。可能的值:

    • 0 - 查询执行为INSERT INTO
    • 1 - 查询执行为REPLACE INTO
  • on_duplicate_clause — 添加到INSERT查询的ON DUPLICATE KEY表达式。只能在replace_query = 0时指定(如果同时传递replace_query = 1on_duplicate_clause,MyScale会生成异常)。

    示例:INSERT INTO t (c1, c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;

    这里,on_duplicate_clauseUPDATE c2 = c2 + 1。请参阅MySQL文档,了解可以与ON DUPLICATE KEY子句一起使用的on_duplicate_clause

  • 目前在MySQL服务器上执行简单的WHERE子句,如=, !=, >, >=, <, <=

  • 其余条件和LIMIT抽样约束仅在MySQL查询完成后在MyScale中执行。

支持多个副本,必须用|列出。例如:

SELECT name FROM mysql(`mysql_host{1|2|3}:3306`, '[mysql_database]', '[mysql_table]', '[mysql_user]', '[mysql_password]');

或者

SELECT name FROM mysql(`mysql_host1:3306|mysql_host2:3306|mysql_host3:3306`, '[mysql_database]', '[mysql_table]', '[mysql_user]', '[mysql_password]');

# 返回值

与原始MySQL表具有相同列的表对象。

# 示例

# MySQL中的表

# 创建数据库
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)
# 创建表
mysql> CREATE TABLE `test`.`test` (
    ->  `int_id` INT NOT NULL AUTO_INCREMENT,
    ->  `float` FLOAT NOT NULL,
    ->  PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0.01 sec)
# 插入数据
mysql> INSERT INTO test.test (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0.00 sec)
# 查询数据
mysql> SELECT * FROM test.test;
+--------+-------+
| int_id | float |
+--------+-------+
|      1 |     2 |
+--------+-------+
1 row in set (0.00 sec)

# 从MySQL中选择数据

SELECT * FROM mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]');
┌─int_id─┬─float─┐
│      1 │     2 │
└────────┴───────┘

# 替换和插入

# 插入数据
INSERT INTO FUNCTION mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]') (int_id, float) VALUES (2, 3);
# 替换数据
INSERT INTO TABLE FUNCTION mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (2, 4);
# 查询数据
SELECT * FROM mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]');
┌─int_id─┬─float─┐
│      1 │     3 │
│      3 │     3 │
└────────┴───────┘

# 将MySQL表中的数据复制到MyScale表中

# 创建表
CREATE TABLE mysql_copy
(
  `id` UInt64 NOT NULL,
  `score` FLOAT NOT NULL,
)
ENGINE = MergeTree
ORDER BY (id);
# 插入数据
INSERT INTO mysql_copy
SELECT * FROM mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]');
# 查询数据
SELECT * from mysql_copy;
┌─int_id─┬─float─┐
│      1 │     2 │
│      3 │     3 │
└────────┴───────┘

# 仅基于当前最大id从MySQL复制增量批次

# 插入数据
INSERT INTO mysql_copy
SELECT * FROM mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]');
WHERE int_id > (SELECT max(id) from mysql_copy);
# 查询数据
SELECT * FROM mysql_copy;
┌─int_id─┬─float─┐
│      1 │     2 │
│      3 │     3 │
└────────┴───────┘

# 相关内容