環境:
OS:CentOS7.2
DB サーバー: 10.1.23-MariaDB 列ストア 1.0.9-1
2 つのテスト データベース、1 つの InnoDB と 1 つの列ストア:
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');
上記と同じ動作を実現したいのですが、残念ながらこれは列ストアによって無視されます。
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');
ただし、どちらにも大きな制限があります。他の同時セッションが挿入を実行する場合、上記の 2 つのクエリの結果は、それらの挿入によって生成される自動インクリメント値の影響を受けます。基本的に、予想される最後に挿入された ID を取得できない可能性がありますが、他のセッションが自動インクリメント値を並行して作成した場合に備えて、より大きな ID を取得します。
私もしようとしました:
テーブルをロックする
挿入を実行します
を使用して最後の挿入 ID を取得します
select callastinsertid('test_cs')
その後、テーブルのロックを解除します
ただし、列ストアではテーブルのロックがサポートされていないようです。
Columnstore で一貫性のある最後に挿入された ID (セッションごと) を達成する可能性はありますか?
私たちの計画は、機能の一部を MariaDB/MySQL から Columnstore に切り替えることですが、上記の制限がかなりの障害になっています。