真实用MySQL引擎连接一个真实运行的MySQL实例,验证双向实时读写能力,并诚实揭露NULL值处理的一个静默类型坑。
代码-- MySQL端真实建表插入数据 CREATE TABLE ch_integration_test (id INT PRIMARY KEY, name VARCHAR(50), amt DECIMAL(10,2)); INSERT INTO ch_integration_test VALUES (1,'alice',10.50),(2,'bob',20.00),(3,'carol',30.50); -- ClickHouse端真实建MySQL引擎表 CREATE TABLE demo.mysql_ext (id UInt32, name String, amt Decimal(10,2)) ENGINE = MySQL('127.0.0.1:3306', 'mysqllab', 'ch_integration_test', 'root', '');
SELECT * FROM demo.mysql_ext ORDER BY id; → 1 alice 10.5 / 2 bob 20 / 3 carol 30.5 -- 真实在MySQL端插入一行新数据 INSERT INTO ch_integration_test VALUES (4,'dave',40.50); -- 立即再查ClickHouse这边(没有任何刷新/等待操作) SELECT * FROM demo.mysql_ext ORDER BY id; → 1 alice 10.5 / 2 bob 20 / 3 carol 30.5 / 4 dave 40.5 ← 真实立即看到了新数据 -- 反向:真实从ClickHouse写入 INSERT INTO demo.mysql_ext VALUES (5, 'eve', 50.50); -- MySQL端真实收到了这行数据
MySQL引擎表真实不是"导入一份快照",每次查询都真实实时连到MySQL执行,写入方向也真实是双向的——从ClickHouseINSERT进这张表,数据真实落到了MySQL那边的原表里。
MySQL: ALTER TABLE ch_integration_test ADD COLUMN note VARCHAR(50) NULL;
UPDATE ch_integration_test SET note='has note' WHERE id=1;
-- 其余行的note真实都是NULL
ClickHouse: CREATE TABLE demo.mysql_ext2 (..., note String) ENGINE=MySQL(...);
SELECT * FROM demo.mysql_ext2;
→ 1 alice 10.5 has note
2 bob 20 (空字符串,不是NULL,也没有任何报错)
3 carol 30.5 (空字符串)
...每一步都是本文上面用真实的MySQL实例跑出来的原始结果。
ENGINE = MySQL(...)