【问题标题】:select from column if exist, if not value is NULL如果存在则从列中选择,如果不存在则值为 NULL
【发布时间】:2017-09-20 01:50:49
【问题描述】:

我有一个从 MySQL 数据库读取一些数据的 Windows 窗体应用程序 (C#)。在新版本中,我需要在其中一个表中添加一个新列(以添加一些功能)。有时我需要创建一个还原数据库(从转储文件)。如果我从旧数据库恢复旧表(没有新列),我会收到“未知列”错误。

我应该如何更改我的 SQL 命令以从该表中选择数据?如果'newcolumn'存在,我需要选择数据,如果没有我需要选择NULL。

MySqlDataAdapter da = new MySqlDataAdapter(
        "SELECT my_id AS Id,myColumn1 AS Column1,myColumn2 AS Column2,
         newcolumn AS NewColumn (here IF NOT EXIST = NULL)", connection);
da.Fill(izpis_podatkov);

谢谢!

【问题讨论】:

  • 首先,您可以尝试使用有效语法的 SQL 语句。
  • 抱歉,这只是为了澄清我的问题所在......显然我的应用程序中有有效的语法。我只是在问是否有办法做我想做的事......

标签: c# mysql ddl


【解决方案1】:

如果您恢复数据库但保留代码原样,则代码和数据库架构之间存在不匹配。最简单的选择是在还原后更改表以添加缺少的列。比如:

ALTER TABLE yourtable ADD newcolumn VARCHAR(255)

显然,将表、列名和数据类型更改为适合您情况的值。

编辑:

您可以通过创建一个存储过程来检查列是否存在并在不存在时添加它,从而更接近您实际要求的内容:

CREATE PROCEDURE `MyStoredProc` ()
BEGIN
    IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = `db_name` AND TABLE_NAME = `newtable` AND COLUMN_NAME = `newcolumn`) 
    BEGIN 
        ALTER TABLE 'newtable' ADD 'newcolumn' VARCHAR(255) NULL;
    END

    SELECT my_id AS Id, myColumn1 AS Column1, myColumn2 AS Column2, newcolumn AS NewColumn FROM newtable;
END

然后您需要更改您的 C# 代码来调用此存储过程:

command = new MySqlCommand(procName, connection); 
da = new MySqlDataAdapter(command); 
command.ExecuteNonQuery(); 
da.Fill(izpis_podatkov);

我不太了解MySql,所以请先检查存储过程的语法!

【讨论】:

  • 是的,我想我必须这样做...我会检查列是否存在,如果不存在,则在恢复的数据库中添加新列。只是想知道我的想法是否可以使用 MySQL。 :)
  • @user1080533 我已经编辑了答案以提供更接近您要求的替代方案。我希望这会有所帮助。
【解决方案2】:

您不能在 MySQL 中使用 SQL 数据操作语言查询来提及表中不存在的列。 MySQL 服务器中的查询计划器会拒绝它,即使它出现在像 IFNULL() 这样的条件上下文中。

您可以像这样使用UNION ALL 操作

         SELECT myColumn1, myColumn2, newColumn
           FROM newTable
          UNION ALL
         SELECT myColumn1, myColumn2, NULL as newColumn
           FROM oldTable

这将返回newTable 的行和oldTable 的行,就好像它们是一个表一样。它基本上将您的两个表隐藏在 UNION 后面,假装它们具有相同的布局,为 oldTable 中缺少的列创建别名。

然后,如果您从备份中恢复 oldTable,您可以截断(删除所有行)newTable,如果这对您的应用程序有意义的话。

您可以使用我在CREATE VIEW 语句中显示的查询,然后您的生产软件会将其视为table

CREATE VIEW table AS
         SELECT myColumn1, myColumn2, newColumn
           FROM newTable
          UNION ALL
         SELECT myColumn1, myColumn2, NULL as newColumn
           FROM oldTable;

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多