【问题标题】:MySQL to MariaDB - Dynamic Columns?MySQL 到 MariaDB - 动态列?
【发布时间】:2020-06-10 23:57:13
【问题描述】:

我正在尝试将数据从 old_table 传输到 table,其中一些数据位于动态列中以供将来导入

INSERT INTO `table` (`col_1`,`col_2`,etc....   `attributes`)
SELECT `col_1`,`col_2`,etc....     COLUMN_CREATE('name',`col_99` AS UNSIGNED,'name2',`col_100` AS CHAR)
FROM `old_table`

关于动态表的唯一文档基本上是

COLUMN_CREATE('name',1 AS UNSIGNED) 

这不是一个非常“动态”的例子......

对其他解决方案开放,但不支持 JSON,但更喜欢 MariaDB,因为它本质上是我习惯的 MySQL

编辑:非常感谢您的回答,但对于更多信息,我正在尝试使用这种方法记录(严重)这里:https://mariadb.com/kb/en/dynamic-columns-functions/

编辑 2:我想知道 EAV 是否​​可能是唯一的解决方案,因为我似乎在使用 MariaDB 动态列时遇到了困难,我在任何地方都找不到更多文档或指南!

编辑 3:这些动态列仍然没有任何运气? MariaDB 真的很混乱!

【问题讨论】:

  • “动态列”是什么意思?
  • 对我来说这听起来完全是错误的方法:-(
  • 对不起,正在努力寻找合适的词来解释。基本上,我可以用大约 200 列和大量空值来做我需要的事情......它不需要增加列数的范围,并且 200 列是可能的,但这不是一个优雅的解决方案。另外,另一种方法是 EAV 方法,但同样,它不优雅,不需要无限数量的列,所以我认为 MariaDB 有这个动态列的东西,有点像在 MySQL 中使用 JSON,但更易于搜索,因此更优雅????
  • 您愿意解释一下 (1) 问题空间是什么 - 例如产品属性,以及 (2) 解释您对 JSON 的厌恶。

标签: mysql sql mariadb sql-insert dynamic-columns


【解决方案1】:

这是你想要的吗?

INSERT INTO `table` (`col_1`, `col_2`, . . . col_99, col_100)
    SELECT `col_1`, `col_2`, . . ., 'name' as col_99, 
           CAST(NULL as char) as col_100  
    FROM `old_table`;

只需列出列及其别名;为新列使用常量。

【讨论】:

  • 印刷错误 - CASE 而不是 CAST。而且这个 CAST 是多余的 - 最终数据类型已经由目标表中的列规范定义。别名也是多余的。如果是CREATE TABLE .. SELECT 查询...
  • 我理解这种方法,但我正在尝试使用 MariaDB“COLUMN_ADD”动态列,因为我正在从多个结构略有不同的旧表中传输数据,这个想法是类似于一种 EAV 方法,但由于可能性有限,而不是说一个包含大量空值的 200 列表,我想尝试像 MariaDB 文档建议的那样制作一个包含可变列的表
【解决方案2】:

对于动态列、JSON 或 EAV,您可以省略 NULL“列”。您只需包含非 null 的项目。

我建议您放弃动态列;它们只存在于那个地方。同时,JSON 正变得越来越被接受。即使您使用的是“旧”版本的 MariaDB 或 MySQL,您也可以将 JSON 文本放在 TEXT 列中。

请记住,没有任何类似 eav 的技术是非常干净的。

关于问题空间的更多信息:http://mysql.rjweb.org/doc.php/eav

至于“更易搜索”——你可能需要做出妥协:

  • 常用搜索字段:以INDEXes 组成列。
  • 考虑带有一些文本数据的FULLTEXT索引。只需将其全部放入一个文本列中即可进行高效搜索。
  • 如果您需要搜索太多不同的字段;使用您的应用程序代码对 JSON 进行解码以完成搜索(在您过滤了 SQL 中的内容之后)。
  • 也就是说,不要期望在 SQL 中执行所有操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多