MySQL8:通过DDL创建集合
MySQL 8: Create Collections via DDL
我希望能够通过简单的 SQL DDL 语句创建 MySQL 文档存储集合,而不是使用 X-Protocol 客户端。
有什么办法吗?
编辑:我会尽力澄清这个问题。
集合是 table 使用 JSON 数据类型和函数的集合。这点很清楚。
我想知道如何在不使用 X-Protocol 调用的情况下创建一个集合 和 确保上述集合被拾取为实际集合。
从 MySQL workbench 来看,集合 table 有一个带有表达式的 _id blob PK,一个 doc JSON 列和一些我不知道的其他元素目前回忆(可能是索引等)。
我无法通过 Workbench 告诉 table 需要什么额外的 schema/metadata 信息才能被视为文档存储集合,或者是否仅存在一个_id 和 doc 列就足够了。
我希望这能解决问题。
所有“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 以来,不允许使用其他列,除了在 doc
上使用 JSON_EXTRACT
并且应该在索引中使用的生成列,见下文(尽管它们实际上不必须在索引中使用)。
任何看起来像这样的 table - doc
和 _id
及其正确的 type/expression,除了可选的 _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使用它们时会实际执行)。
我希望能够通过简单的 SQL DDL 语句创建 MySQL 文档存储集合,而不是使用 X-Protocol 客户端。
有什么办法吗?
编辑:我会尽力澄清这个问题。
集合是 table 使用 JSON 数据类型和函数的集合。这点很清楚。 我想知道如何在不使用 X-Protocol 调用的情况下创建一个集合 和 确保上述集合被拾取为实际集合。
从 MySQL workbench 来看,集合 table 有一个带有表达式的 _id blob PK,一个 doc JSON 列和一些我不知道的其他元素目前回忆(可能是索引等)。
我无法通过 Workbench 告诉 table 需要什么额外的 schema/metadata 信息才能被视为文档存储集合,或者是否仅存在一个_id 和 doc 列就足够了。
我希望这能解决问题。
所有“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 以来,不允许使用其他列,除了在 doc
上使用 JSON_EXTRACT
并且应该在索引中使用的生成列,见下文(尽管它们实际上不必须在索引中使用)。
任何看起来像这样的 table - doc
和 _id
及其正确的 type/expression,除了可选的 _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使用它们时会实际执行)。