【问题标题】:SQL; how to skip 'ALTER TABLE' if the columns already existsSQL;如果列已存在,如何跳过“ALTER TABLE”
【发布时间】:2019-08-06 11:57:32
【问题描述】:

所以,如果之前已经更改过的表,我不想更改表。在我的 WPF 应用程序中,我有一个用于创建新空表的按钮,然后我使用另一个按钮更改表,在该过程中,我将新列添加到空表中。之后,我将数据插入到列中。现在我的问题是,当我再次单击该按钮时,它想在插入之前再次更改表,但由于列已经存在而引发错误。

我想要的是在列已经存在时跳过“更改表”。 这是我的基本代码,只需单击一下即可:

 public bool updateTable(string tableNamee, string question, string Atype)
        {
            try
            {

                string query = $"ALTER TABLE appdb.{tableNamee} ADD question VARCHAR(100) NOT NULL AFTER questionID, ADD Atype VARCHAR(20) NOT NULL AFTER question; ";

                string query2 = $"INSERT INTO appdb.{tableNamee} (question, Atype) VALUES('{question}','{Atype}'); ";

            etc

这是我尝试过的:

 public bool updateTable(string tableNamee, string question, string Atype)
        {
            try
            {

                string q = $"IF NOT EXISTS( SELECT NULL FROM appdb.{tableNamee} WHERE table_name = {tableNamee} AND table_schema = appdb " +
                $"AND column_name = question, Atype)  THEN ALTER TABLE appdb.{tableNamee} ADD question VARCHAR(100) NOT NULL AFTER questionID, ADD Atype VARCHAR(20) NOT NULL AFTER question; END IF; ";


                string query2 = $"INSERT INTO appdb.{tableNamee} (question, Atype) VALUES('{question}','{Atype}'); ";

           etc

但我收到以下错误:“您的 SQL 语法有错误” 我厌倦了将代码组合成多种变体,但我看不出语法有什么问题。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 看看here
  • 我建议让您的 C# 应用程序查询信息模式表以获取表的当前列。然后,仅当新列尚未出现在列表中时,才使用ALTER TABLE 命令添加新列。
  • @MuhammadHannan 这是针对 SQL Server 的。这是 MySql。
  • 你不应该检查列数据,而是检查表结构

标签: c# mysql


【解决方案1】:

正如@tim-biegeleisen 写道:首先检查是否存在。
正如@bradbury9 所写:检查架构而不是数据。

这样调用查询:

SHOW COLUMNS FROM 'tablename' LIKE 'fieldname';
或者这个:

SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'tablename' AND COLUMN_NAME = 'fieldname'

然后根据结果调用ALTER TABLE...查询与否。

【讨论】:

  • string q = $"IF COL_LENGTH('appdb.{tableNamee}', 'question') IS NULL BEGIN ALTER TABLE appdb.{tableNamee} ADD question VARCHAR(100) NOT NULL AFTER questionID, ADD Atype VARCHAR(20) NOT NULL AFTER END; ";这里可能有什么问题?再次给出语法错误...
  • 不知道。设置断点并查看q 包含的内容。然后将字符串粘贴到您的 sql 工具或 SqlFiddle 中,看看您是否获得更多信息。
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2018-04-27
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多