MySQL 8: создание коллекций через DDL
Я хотел бы иметь возможность создавать коллекции хранилища документов MySQL с помощью простых операторов SQL DDL, а не с использованием клиентов X-Protocol.
Есть ли способ сделать это?
Изменить: я постараюсь прояснить вопрос.
Коллекции - это таблицы, использующие типы данных и функции JSON. Это ясно. Я хотел бы знать, как я могу создать коллекцию без использования вызовов X-Protocol и убедиться, что вышеупомянутая коллекция выбрана как фактическая коллекция.
Судя по рабочей среде MySQL, в таблицах коллекций есть PK _id blob с выражением, столбец doc JSON и несколько других элементов, которые я не помню на данный момент (могут быть индексы и т. Д.).
У меня нет средств сообщить через Workbench, какая дополнительная информация о схеме / метаданных требуется для того, чтобы таблица считалась коллекцией хранилища документов, или достаточно ли простого наличия столбцов _id и doc.
Надеюсь, это проясняет ситуацию.
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,
-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).