【发布时间】:2017-08-02 12:59:23
【问题描述】:
环境:
操作系统:CentOS 7.2
数据库服务器:10.1.23-MariaDB Columnstore 1.0.9-1
2个测试数据库,1个InnoDB和1个Columnstore:
CREATE TABLE `test_innodb` (
`ctlid` bigint(20) NOT NULL AUTO_INCREMENT,
`rfid` varchar(100) DEFAULT NULL,
PRIMARY KEY (`ctlid`)
) ENGINE=InnoDB
CREATE TABLE `test_cs` (
`ctlid` bigint(20) DEFAULT NULL COMMENT 'autoincrement=1',
`rfid` varchar(100) DEFAULT NULL
) ENGINE=Columnstore
问题:
我在 InnoDB 表中运行了几次插入:
insert into test_innodb (rfid) values ('a1');
...
insert into test_innodb (rfid) values ('aX');
当我想获取最后插入的 id 时,我运行以下命令:
select last_insert_id();
无论是否有其他并发会话在该 InnoDB 表中运行插入并触发创建其他 ctlid 值,结果都会正确显示当前会话期间插入的最后一个 ctlid 值。到目前为止一切顺利..
现在,我对 Columnstore 表执行了几次插入操作:
insert into test_cs (rfid) values ('a1');
...
insert into test_cs (rfid) values ('aX');
我想实现与上述相同的行为,但不幸的是,Columnstore 忽略了这一点:
select last_insert_id();
我使用了以下替代方法:
-- this will return the next value
select nextvalue from calpontsys.syscolumn cs where cs.schema='my_test_database' and cs.tablename='test_cs' and cs.columnname='ctlid';
- this will return the last inserted id
select callastinsertid('test_cs');
但两者都显示出一个主要限制:如果其他并发会话运行插入,则上述两个查询的结果会受到这些插入生成的自动增量值的影响。基本上我可能不会得到预期的最后插入的 id,但如果其他会话并行创建自动增量值,我可能会得到更大的。
我也尝试过:
锁定表
执行插入
使用
select callastinsertid('test_cs')获取最后插入id之后解锁表
但列存储似乎不支持锁定表。
是否有可能使用 Columnstore 实现一致的最后插入 id(每个会话)?
我们的计划是将我们的一些功能从 MariaDB/MySQL 切换到 Columnstore,但上面的限制非常困难。
【问题讨论】:
-
这似乎是一个
bug问题。它还有一个开放的 jira jira.mariadb.org/browse/MCOL-780 -
唯一的“解决方案”是使用类似
select ctlid from test_cs order by ctlid desc limit 1 -
很遗憾,目前还没有解决方案。我只是在另一个论坛上得到了明确的答案:groups.google.com/forum/…
标签: database mariadb last-insert-id columnstore