【问题标题】:Insert values to dynamic mysql table without knowing its columns在不知道其列的情况下将值插入动态 mysql 表
【发布时间】:2020-02-18 18:40:40
【问题描述】:

我正在尝试构建一个通用方法,其目的是将值插入到 SQL 表中

问题在于 SQL 表仅在运行时才知道。

该方法接收一个字符串,该字符串指定要插入的值。由于设计问题,这是它收到的唯一参数:它的签名:

public Integer create(String values){}

我的问题是:我如何编写代码,让该方法知道它有哪些列 - 在字符串名称中?

我在想:

Statement s = c.createStatement(); //c is of type Connection
String insert_Q = "INSERT INTO " + tableName + (THIS IS WHERE I AM STUCK - HOW TO RETRIEVE COLUMNS??) + " VALUES('" + VALUES    + "');" ;

s.executeUpdate(insert_Q);

提前致谢!

【问题讨论】:

  • SQL 是一种声明性语言。对于插入,you 告诉 SQL 哪些列应该接收哪些值。即使您可以以某种方式猜测内部列顺序,它也可能在引擎盖下的任何位置发生变化。所以,你应该弄清楚目标列是什么。
  • @Tim Bieelisen 谢谢。所以你建议没有办法在运行时知道我有哪些列用于 MySQL 表?
  • 可以找出这些信息,但问题是,即使您获得了列名列表,您仍然需要以某种方式将它们与值的集合相关联要插入。所以...在开始编写 Java 代码之前,您确实应该弄清楚列名和目标。
  • “因为设计问题...” 我猜问题是没有没有设计。是时候改变设计了。我建议让这个函数使用HashMap 而不是单个字符串。

标签: java mysql sql dynamic insert


【解决方案1】:

你已经知道表名了

第 1 步:使用从表中获取列数

    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME  = 'Table_Name'

使用它从表中获取总列数。

然后你可以执行你的语句。

【讨论】:

  • 您可能还需要一个术语 TABLE_SCHEMA,因为如果该名称的表存在于多个模式中,您将获得 all 表的列同名。
  • 需要点击信息模式表来执行诸如插入之类的简单操作,恕我直言,代码味道或设计味道。
  • 我认为这种情况是由于最初的设计而发生的,我认为设计要改变或者必须使用信息模式。
  • “需要点击信息模式表来做一个简单的操作,比如插入,恕我直言,要么是代码味道,要么是设计味道” 非常同意@TimBiegeleisen至少在应用程序中缓存信息模式的地方经常表不会改变..仍然不理想但更好..
  • @mahadev kalyan srikanth 谢谢。如何将该查询合并到java?顺便说一句,我知道设计有问题。正如你所理解的 - 这是一个没有人知道如何解决的练习:-(
猜你喜欢
  • 2020-09-08
  • 2014-02-22
  • 2011-07-29
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
相关资源
最近更新 更多