如果存在则从列中选择,如果不是值则为NULL

时间:2017-04-23 10:48:45

标签: c# mysql ddl

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

如何更改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);

谢谢!

2 个答案:

答案 0 :(得分: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,所以请先检查存储过程的语法!

答案 1 :(得分:0)

您无法在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;