【问题标题】:Mariadb columnstore autoincrement not workingMariadb 列存储自动增量不起作用
【发布时间】:2017-05-25 20:25:24
【问题描述】:

我正在尝试使用 Mariadb 列存储,但在定义了自动增量列的表中插入数据时出现了一些错误。

使用 JDBC 驱动程序时会出现此问题。

CREATE TABLE schema.mytable
(
  deaf_id bigint NOT NULL COMMENT 'autoincrement=1',
  name varchar(80) NOT NULL,
  country varchar(14) NOT NULL
) ENGINE=ColumnStore;

使用 DBeaver,我尝试在表上插入新数据:

INSERT INTO schema.mytable
(name, country)
VALUES('ny', 'usa');

但我收到以下错误:

SQL 错误 [1364] [HY000]: (conn:4) 字段 'deaf_id' 没有 默认值

但是使用mcsmysql,我可以成功添加数据:

MariaDB [schema]> INSERT INTO schema.mytable (name, country) VALUES('ny', 'usa');
Query OK, 1 row affected, 1 warning (0.28 sec)

MariaDB [schema]> select * from schema.mytable;
+---------+------+---------+
| deaf_id | name | country |
+---------+------+---------+
|       1 | ny   | usa     |
+---------+------+---------+
1 row in set (0.07 sec)

MariaDB [bovespa]>

我尝试使用这两个驱动程序:

https://downloads.mariadb.com/Connectors/java/connector-java-2.0.1/mariadb-java-client-2.0.1.jar

https://downloads.mariadb.com/Connectors/java/connector-java-1.5.9/mariadb-java-client-1.5.9.jar

这有什么已知问题吗?还是我错过了什么?

克莱森里奥斯。

【问题讨论】:

  • 你能在你的mcsmysql中运行这个命令SHOW WARNINGS\G
  • 我觉得这个deaf_id bigint NOT NULL COMMENT 'autoincrement=1',应该是deaf_id bigint NOT NULL AUTO_INCREMENT,
  • @Hackerman 我会检查“警告”,我会按照你的建议尝试。但奇怪的是,官方文档只提到了我做mariadb.com/kb/en/mariadb/columnstore-create-table的方式。
  • 哪个版本的 MariaDB?
  • @RickJames 对于 mariadb-columnstore-1.0.8-1-centos7.x86_64.rpm.tar.gz 和 mariadb-columnstore-1.0.9-1-centos7.x86_64 两个版本的错误相同。 rpm.tar.gz

标签: mysql mariadb columnstore


【解决方案1】:

简答:

不是客户端或驱动程序问题。这是一个列存储用户权限问题。 假设您用于连接到 Columnstore 的用户称为“myuser”。以 root 身份运行以下命令:

-- if necessary replace % below with localhost or whatever IP you use for the connection
GRANT ALL PRIVILEGES ON `infinidb_vtable`.* TO 'myuser'@'%';
FLUSH PRIVILEGES;

现在尝试使用“myuser”再次连接,无论您使用 DBeaver 还是其他客户端。您应该能够运行插入。

长答案:

首先,让我们回顾一下正确的创建表语法,因为 Columnstore 和 Innodb 在定义自动增量字段时是不同的:

-- Columnstore syntax
CREATE TABLE schema.mytable
(
  deaf_id bigint NOT NULL COMMENT 'autoincrement=1',
  name varchar(80) NOT NULL,
  country varchar(14) NOT NULL
) ENGINE=ColumnStore;

-- InnoDB syntax
CREATE TABLE schema.mytable
(
  deaf_id bigint NOT NULL AUTO_INCREMENT,
  name varchar(80) NOT NULL,
  country varchar(14) NOT NULL,
  PRIMARY KEY (`deaf_id`)
) ENGINE=InnoDB;

不要混淆它们,因为您可能会得到错误或意外结果。

你描述的问题过去也让我有些头疼。下面的错误非常具有误导性:

SQL 错误 [1364] [HY000]: (conn:4) 字段 'deaf_id' 没有 默认值

如果您尝试运行:

select * from mytable;

你会得到一个更有用的错误:

错误 1044 (42000):用户 'myuser'@'%' 拒绝访问数据库 'infinidb_vtable'

基于这个错误,我发现这个页面给出了详细的解释:

https://mariadb.com/kb/en/mariadb/columnstore-database-user-management/

所以,只要运行我在答案开头写的 GRANT,你的问题就解决了。不要忘记对您希望能够访问列存储表的所有用户运行相同的授权。

作为完成前的简短建议.. 三思而后行,您是想使用 Columnstore 还是坚持使用 MySQL/MariaDB InnoDB。 我们目前正在进行 Columnstore 评估。当谈到在大表上的选择速度时,它向我们展示了一些非常令人印象深刻的性能。我怀疑即使经过精心调优,我也无法使用 MySQL/MariaDB 获得一半的性能。

但列存储有其自身的缺点。我会提到其中两个让我们有些头疼的:

  • 插入速度很差(根据我们的一些测试,插入速度比类似的 InnoDB 表慢 20 倍)

  • 列存储尚未成熟,因此有时可能会让您头疼

因此请谨慎选择您的数据库引擎。

[编辑:]

我忘了提到我说的是 MariaDB Columnstore 1.0.9。未来的版本可能会显示不同的语法/行为等。

【讨论】:

  • 非常感谢您的回答。
【解决方案2】:

GRANT PRIVILEGES 没有解决我的问题。我通过将 id 自动增量字段声明为 NULL 而不是 NOT NULL 来解决此问题。

CREATE TABLE schema.mytable
(
  id bigint NULL COMMENT 'autoincrement=1',
  name varchar(80) NOT NULL,
  country varchar(14) NOT NULL
) ENGINE=ColumnStore;

【讨论】:

    猜你喜欢
    • 2015-11-22
    • 2013-05-25
    • 2023-03-21
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多