# MySQL
Allows SELECT
and INSERT
queries to be performed on data that is stored on a remote MySQL server.
# Syntax
mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause'])
Arguments
host:port
— MySQL server address.database
— Remote database name.table
— Remote table name.user
— MySQL user.password
— User password.replace_query
— Flag that convertsINSERT INTO
queries toREPLACE INTO
. Possible values:0
- The query is executed asINSERT INTO
.1
- The query is executed asREPLACE INTO
.
on_duplicate_clause — The
ON DUPLICATE KEY
expression that is added to theINSERT
query. Can be specified only withreplace_query = 0
(if you simultaneously passreplace_query = 1
andon_duplicate_clause
, MyScale generates an exception).Example:
INSERT INTO t (c1, c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;
Here,
on_duplicate_clause
isUPDATE c2 = c2 + 1
. See the MySQL documentation to find whichon_duplicate_clause
you can use with theON DUPLICATE KEY
clause.Simple
WHERE
clauses such as=
,!=
,>
,>=
,<
,<=
are currently executed on the MySQL server.The rest of the conditions and the
LIMIT
sampling constraint are executed in MyScale only after the query to MySQL finishes.
Supports multiple replicas that must be listed by |
. For example:
SELECT name FROM mysql(`mysql_host{1|2|3}:3306`, '[mysql_database]', '[mysql_table]', '[mysql_user]', '[mysql_password]');
or
SELECT name FROM mysql(`mysql_host1:3306|mysql_host2:3306|mysql_host3:3306`, '[mysql_database]', '[mysql_table]', '[mysql_user]', '[mysql_password]');
# Returned Value
A table object with the same columns as the original MySQL table.
# Examples
# Table in MySQL
# CREATE DATABASE
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)
# CREATE TABLE
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)
# INSERT
mysql> INSERT INTO test.test (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0.00 sec)
# SELECT
mysql> SELECT * FROM test.test;
+--------+-------+
| int_id | float |
+--------+-------+
| 1 | 2 |
+--------+-------+
1 row in set (0.00 sec)
# Selecting data from MySQL
SELECT * FROM mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]');
┌─int_id─┬─float─┐
│ 1 │ 2 │
└────────┴───────┘
# Replacing and Inserting
# INSERT
INSERT INTO FUNCTION mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]') (int_id, float) VALUES (2, 3);
# REPLACE
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
SELECT * FROM mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]');
┌─int_id─┬─float─┐
│ 1 │ 3 │
│ 3 │ 3 │
└────────┴───────┘
# Copying data from MySQL table into MyScale table
# CREATE TABLE
CREATE TABLE mysql_copy
(
`id` UInt64 NOT NULL,
`score` FLOAT NOT NULL,
)
ENGINE = MergeTree
ORDER BY (id);
# INSERT
INSERT INTO mysql_copy
SELECT * FROM mysql('[host:port]', 'test', 'test', '[mysql_user]', '[mysql_password]');
# SELECT
SELECT * from mysql_copy;
┌─int_id─┬─float─┐
│ 1 │ 2 │
│ 3 │ 3 │
└────────┴───────┘
# Copying only an incremental batch from MySQL based on the max current id
# INSERT
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
SELECT * FROM mysql_copy;
┌─int_id─┬─float─┐
│ 1 │ 2 │
│ 3 │ 3 │
└────────┴───────┘