【问题标题】:How to insert a vector into a column of a table in mysql?如何将向量插入到mysql中表的列中?
【发布时间】:2018-06-28 00:15:24
【问题描述】:

在 R 中,我有一个字符串向量“myVector”,我想将其插入到 mysql 表“myTable”的列“myColumn”中。我知道我可以编写 sql 查询并使用 dbSendQuery 在 R 中运行它。所以我们先搞清楚sql查询。这是一个例子:

myVector = c("hi","I", "am")

让我们在 myTable 的 myColumn 列中插入 myVector,行号 3 到 5,这是除了最后一行我不知道的 sql 查询:

UPDATE myTable t JOIN
       (SELECT id
        FROM myTable tt
        LIMIT 3, 3
       ) tt
       ON tt.id = t.id
    SET myColumn = myVector;

谢谢

【问题讨论】:

  • 请注意,没有 ORDER BY 的 LIMIT 是毫无意义的
  • 您是要插入记录,还是更新现有记录?
  • 不清楚。请向我们展示表架构 (SHOW CREATE TABLE) 和所需的操作结果。
  • idmyTableAUTO INCREMENT PRIMARY KEY 中吗?您的更新查询显示它不是,或者默认情况下您有一些其他字段可以对表进行排序。

标签: mysql sql vector rmysql


【解决方案1】:

假设我正确理解了您的问题,我想到了两种可能的解决方案:

1.每个元素一列: 如果您的向量都具有相同数量的元素,则可以将它们中的每一个存储在单独的列中。从上面的示例开始,表格可能如下所示。 (列的大小以及是否允许空值取决于您的数据)

CREATE TABLE `myTable` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `element1` varchar(255) DEFAULT NULL,
  `element2` varchar(255) DEFAULT NULL,
  `element3` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

从上面插入向量的语句是:

INSERT INTO `myTable` (`id`, `element1`, `element2`, `element3`)
VALUES (1, 'hi', 'I', 'am');

根据你的向量有多少元素,这种方法可能或多或少适用。

2。将向量存储为 blob: 另一种方法可能是将向量存储为 blob。 Blob(二进制大对象)是一种存储可变数量(二进制)数据的数据类型(请参阅:https://dev.mysql.com/doc/refman/5.7/en/blob.html)。这个想法来自这篇文章:http://jfaganuk.github.io/2015/01/12/storing-r-objects-in-sqlite-tables/

可以使用以下语句创建表:

CREATE TABLE `myTable` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `myVector` blob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

插入向量时,将变量绑定到查询。由于我不是 R 专家,我会参考这篇文章了解实现细节。

【讨论】:

    【解决方案2】:

    我不知道,如果 MySQL 支持 Vector 数据类型,但您可以将表设计为解决方法,其中 Vector 可以存储在不同的表中,并且与 myTable 的关系为 1-M

    这有助于您轻松管理和检索详细信息。所以,假设myTable 是你的桌子,它的现有设计是:

    myTable
    -------
    id
    col1
    vectorCol
    

    所以,你的主表可以是

    CREATE TABLE myTable (
        id        INT NOT NULL AUTO_INCREMENT,
        col1  varchar(50),
        PRIMARY KEY (id)
    );
    

    和存储您的矢量的表格。

    CREATE TABLE vectorTab ( 
        id    INT NOT NULL AUTO_INCREMENT, -- in case ordering matter
        parent_id        INT NOT NULL, 
        value     TEXT,
        PRIMARY KEY (id),
        FOREIGN KEY (parent_id) REFERENCES myTable (id) ON DELETE CASCADE ON UPDATE CASCADE
    );
    

    【讨论】:

      【解决方案3】:

      您应该做的是将您的R 向量导出为JSON,例如使用toJSON() 函数:

      myJSONVector = toJSON(c("hi","I", "am"))
      

      同时创建或更改myTable,以便myColumn 具有适当的JSON Data Type

      尝试将值插入 JSON 列成功,如果该值 是一个有效的 JSON 值,但如果不是则失败:

      示例

      CREATE TABLE `myTable` (`myColumn` JSON);
      INSERT INTO `myTable` VALUES(myJSONVector); // will fail if myJSONVector is not valid JSON
      // update query would be
      UPDATE `myTable` SET `myColumn` = myJSONVector
      WHERE `id` IN (3,4,5);
      

      另外 你可以使用函数fromJSON()JSON创建一个R向量。

      【讨论】:

        猜你喜欢
        • 2015-07-09
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多