2

我正在尝试使用 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

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

克莱森里奥斯。

4

2 回答 2

3

简短的回答:

不是客户端或驱动程序问题。这是一个列存储用户权限问题。假设您用于连接到 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 获得一半的性能。

但 Columnstore 也有其自身的缺点。我会提到其中两个让我们有些头疼的问题:

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

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

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

[编辑:]

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

于 2017-08-02T14:47:36.357 回答
0

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;
于 2022-01-14T21:47:14.567 回答