【问题标题】:MySQL 8: Create Collections via DDLMySQL 8:通过 DDL 创建集合
【发布时间】:2020-07-08 08:39:33
【问题描述】:

我希望能够通过简单的 SQL DDL 语句而不是使用 X-Protocol 客户端来创建 MySQL 文档存储集合。

有什么办法吗?

编辑:我会尝试澄清这个问题。

集合是使用 JSON 数据类型和函数的表。这很清楚。 我想知道如何在不使用 X-Protocol 调用的情况下创建一个集合并且确保上述集合被拾取为实际的集合。

从 MySQL 工作台来看,集合表有一个带有表达式的 _id blob PK、一个 doc JSON 列和一些我目前不记得的其他元素(可能是索引等)。

我无法通过 Workbench 告诉我们需要什么额外的架构/元数据信息才能将表视为文档存储集合,或者仅存在 _id 和 doc 列是否足够。

我希望这可以解决问题。

【问题讨论】:

  • 没有足够的数据来做出有意义的回应。
  • @Akina 您要查找哪种数据,以便我可以将其添加到问题中?我不确定缺少什么。
  • 文档存储api的集合部分是json datatype and json functions的映射器(反之亦然),例如创建集合与使用 sql 语法创建具有 json 列的表基本相同。如果您有特定问题或疑问,则需要添加更多详细信息。
  • @Solarflare 我添加了更多信息。

标签: mysql ddl mysql-8.0 connector-net sqlmigrations


【解决方案1】:

所有“x-api”指令都直接映射到sql语法。当你例如运行db.createCollection('my_collection'),MySQL 将直接执行

CREATE TABLE `my_collection` (
  `doc` json DEFAULT NULL,
  `_id` varbinary(32) GENERATED ALWAYS AS
     (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
  `_json_schema` json GENERATED ALWAYS AS (_utf8mb4'{"type":"object"}') VIRTUAL,
  PRIMARY KEY (`_id`),
  CONSTRAINT `$val_strict` CHECK (json_schema_valid(`_json_schema`,`doc`))
      NOT ENFORCED
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

如果您遵循该格式,您可以自己运行相应的 sql 语句。 doc_id(带有它们的类型和给定的表达式)是必需的,_json_schema 是可选的,检查也是(并且仅从 M​​ySQL 8.0.17 开始添加)。从 MySQL 8 开始,除了在 doc 上使用 JSON_EXTRACT 并且应该在索引中使用的生成列之外,不允许使用其他列,请参见下文(尽管它们实际上不必在索引中使用) .

任何看起来像这样的表 - doc_id 具有正确的类型/表达式,除了可选的 _json_schema 和生成的 JSON_EXTRACT(doc,-columns 之外没有其他列 - 将使用 getCollections() 找到。

要添加索引,对应的语法为

my_collection.createIndex("age", {fields: [{field: "$.age", type: "int"}]})

ALTER TABLE `test`.`my_collection` ADD COLUMN `$ix_i_somename` int
      GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$.age')) VIRTUAL, 
   ADD INDEX `age` (`$ix_i_somename`)

显然,

db.dropCollection('my_collection')

简单地翻译成

DROP TABLE `my_collection`

类似地,所有对文档的 CRUD 操作都有对应的 sql DML 语法(当你通过 x-api 使用它们时会实际执行)。

【讨论】:

  • 谢谢你,很抱歉没有尽快接受这个答案,没有收到任何通知。
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多