【问题标题】:Create a new table with a column for every element in another table为另一个表中的每个元素创建一个包含一列的新表
【发布时间】:2018-12-03 10:17:23
【问题描述】:

我在 MySQL 中创建了一个表,其中包含我要从 FRED 数据中引入的所有数据名称。

现在我想创建一个新表,上面的示例表中的 1504 个名称,每个都有一列。

AAA AAA10M AAAFFM ADBJORNS and so on.

因此,fred_namecol 中的每个名称都应该得到一列,每个列都有数字作为值。有没有一种简单的方法来代替手动编写每个人?

也许有一种方法可以遍历每个名​​称并为它们创建一个列到一个新表中?

【问题讨论】:

  • 坏主意.. MySQL 在表中有最大列限制,因此如果有人提供“解决方案”,它将因记录过多而失败.. “MySQL 的硬限制是每个表 4096 列,但是给定表的有效最大值可能会更小。确切的列限制取决于几个因素:“ source dev.mysql.com/doc/refman/5.7/en/column-count-limit.html
  • 您的用户(其中​​ 1504 个)有一张桌子。您想为每个用户记录一个数值吗?因此,只需在您的用户表中添加一个具有数字类型的新列并将数字存储在那里。不需要另一张桌子。在行上做,而不是在列上做。如果您的模型强制进行这样的设置,我认为您的模型是错误的。
  • 我会得到1504列,而且数据是时间序列,所以我稍后会插入一个日期列。

标签: mysql sql database loops


【解决方案1】:

是的。有一种方法。

在以下查询中; 替换 WRITE_YOUR_TABLE_NAME_HERE 为包含fred_namecol 列的表的名称:

drop table if exists columns_over_1000;
set @prefix = 'CREATE TABLE columns_over_1000 (';
set @suffix = '\n);';
select @create_table_sql := concat(
    @prefix, 
        group_concat('\n    `', fred_namecol, '` INT'), 
    @suffix) 
from `WRITE_YOUR_TABLE_NAME_HERE`;

PREPARE stmt1 FROM @create_table_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

select * from columns_over_1000;

【讨论】:

  • 这段代码几乎可以工作,我明白了,谢谢,但我收到一个错误,不知道为什么,“错误代码:1064。您的 SQL 语法有错误;请查看您的 MySQL 服务器版本的手册。”错误出现在准备 stmt1。但我明白了,我得到了一个包含所有列名的文本。
  • @A.Salehi 是的,PREPARE 实际上是将该文本设置为一个名为 stmt1 的变量并执行它。您可以删除 PREPARE 之后的行(包括 PREPARE),然后简单地从结果中复制并粘贴生成的 sql。
  • 这就是关于错误的全部内容吗?理解原因很简单。如果没有,请您在此处写下整个错误。
  • 是的,它就是这么说的。奇怪找不到原因,直接从代码中复制。我试图复制并粘贴生成的 SQL 文本,但它不是列表中的所有 1504 个名称(我只得到前 52 个名称)。我尝试复制行和所有其他复制选项,将其复制到新脚本中。当我在查看器中打开相同的值时,并不是所有的都在那里。
  • 类型是 MEDIUMTEXT 也许这就是为什么?我发现这个“stackoverflow.com/questions/31658760/group-concat-and-longtext”“我相信你应该能够为会话(当前连接)设置它,而无需在服务器上全局/永久更改它。执行类似 SET group_concat_max_len = 1000000; 在您的查询之前应该解决问题。”现在解决了,我可以把它复制到一个新的脚本!感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多