【问题标题】:Add dynamic column to existing MySQL table?向现有 MySQL 表添加动态列?
【发布时间】:2014-12-12 14:10:59
【问题描述】:

只是想知道如何将动态列插入现有的 MySQL 表?例如:我已经有了“sampletable”,我想制作可以将动态列添加到现有tableexample: column1, column2, column3 的输入字段。如何使用动态编号做到这一点?

【问题讨论】:

  • 如果您需要这样做,您可能是在设计错误的数据库。向表中添加列的唯一方法是使用ALTER TABLE,没有动态列之类的东西。
  • 如果需要动态计算列名,则必须使用动态SQL与PREPARE
  • 您好,感谢您的快速回复。好吧,顺便说一句,没有动态列之类的东西,所以我应该已经在表中创建 column1、column2、column3,然后创建连接到数据库中现有列的输入字段,对吧?如果制作输入字段的用户只想输入 column1 怎么办? column2 和 column3 将在表中为空,因此这就是为什么我要创建一个可以添加到适合用户需求的表的列。
  • 这没有通过气味测试..你不应该这样做..它背后的目的是什么?
  • 就像我说的,如果你认为你需要动态列,那你就错了。任何动态变化的东西都应该在值中,而不是在列中。

标签: php mysql


【解决方案1】:

实际上,我认为您打算做的事情,即添加动态列根本不是一个好习惯。反正 你可以使用ALTER TABLE

for($i=1;$i<4;$i++){

    mysqli_query("ALTER TABLE mytable ADD COLUMN `input.$i` VARCHAR(40)",$db_con);
}

但我会建议同样的方式,也就是上面cmets中提到的BARMER

【讨论】:

  • 如果列名包含点,则需要在其周围加上反引号。
  • 一开始我会忽略这个点。这并不重要,因为整个方法都是错误的。
  • 是的,我知道。将列动态添加到表中是完全错误的。我不知道 OP 为什么要这样做。
【解决方案2】:

如果您尝试这样做,我同意@Barmar 的观点,即您的 SQL 表结构是错误的。在这种情况下,您尝试做的是所谓的“一对多”关系。这通常通过执行以下操作来实现。

表 1:包含所有常用数据的列(在您的术语中是非“动态”列),以及所有好的数据库表都应该具有的唯一 ID 列

表 2:一个 ID 列,以及引用表 1 上 ID 列的列和动态列中的数据列。

现在您可以将通常存储在“动态列”中的值存储在第二个表的各个行中。

示例

//  sample:
//
// | id | name |
//
// dynamic_values:
//
// | id | sample_id | value |

// Selecting data

SELECT * FROM sample WHERE id = 1;
SELECT * FROM dynamic_values WHERE sample_id = 1;

// Querying on "dynamic columns"
SELECT * FROM sample s LEFT JOIN dynamic_values d ON d.sample_id = s.id WHERE d.value = 'something';

【讨论】:

    【解决方案3】:

    试试这组代码为现有表创建动态列。

    SET SQL_SAFE_UPDATES = 0;
            Drop TEMPORARY table if exists Temp_Report;
            CREATE TEMPORARY TABLE Temp_Report (Report_Date Date);
    
            Drop TEMPORARY table if exists Temp_Product_Tax;
            CREATE TEMPORARY TABLE Temp_Product_Tax as SELECT concat(REPLACE(Tax_category,' ','_'),'|',Taxvalue) as 'Tax_category',Taxvalue FROM tax_category c left join taxmaster t on c.id=t.catid ; -- where c.is_Product =1
    
        select * from Temp_Product_Tax;
                set Count_1=(SELECT COUNT(*) FROM Temp_Product_Tax);
                    set Var_1=0;     
                        While(Count_1>Var_1) do
                                set @Col_Name=Concat( Var_1+1,'_',REPLACE((select Tax_category from Temp_Product_Tax limit Var_1,1),'.','_'),' Double(15,2)');
    
                                set @Col_Name=Concat('ALTER TABLE Temp_Report ADD COLUMN ', @Col_Name) ;
                                PREPARE stmt FROM @Col_Name;
                                EXECUTE stmt;
    
                        set Var_1=Var_1+1;
                        END While;  
    
        select * from Temp_Report;
    
        SET SQL_SAFE_UPDATES = 1;
    

    【讨论】:

      猜你喜欢
      • 2020-07-10
      • 2013-03-27
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      相关资源
      最近更新 更多