MySQL 8:通过DDL创建集合

时间:2020-07-08 08:39:33

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

我希望能够通过简单的SQL DDL语句而不是使用X-Protocol客户端来创建MySQL Document Store Collections。

有什么办法吗?

编辑:我将尝试阐明问题。

集合是使用JSON数据类型和函数的表。那很清楚。 我想知道如何在不使用X-Protocol调用 的情况下创建馆藏,并确保将上述馆藏选作实际的馆藏。

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

我无法通过工作台告知将表视为文档存储集合所需的其他架构/元数据信息,或者仅存在_id和doc列是否足够。

我希望这可以解决所有问题。

1 个答案:

答案 0 :(得分: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是可选的,检查也是可选的(仅自MySQL 8.0.17起才添加)。从MySQL 8开始,除了在JSON_EXTRACT上使用doc并应在索引中使用的生成列之外,不允许使用其他列,请参见下文(尽管实际上不必使用它们在索引中)。

任何看起来像这样的表-doc_id都具有正确的类型/表达式,除了可选的_json_schema和生成的JSON_EXTRACT(doc,列以外,没有其他列-与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使用它们时实际上将执行该语法)。