select 来自列如果存在,如果不存在则值为 NULL
select from column if exist, if not value is NULL
我有一个 windows 表单应用程序 (C#),它从 MySQL 数据库中读取一些数据。在新版本中,我需要在 table 之一中添加一个新列(以添加一些功能)。有时我需要制作一个恢复数据库(从转储文件)。如果我从旧数据库(没有新列)恢复旧 table,我会得到 "unnknown column" 错误。
我应该如何将 SQL 命令更改为来自 table 的 select 数据?如果 'newcolumn' 存在,我需要 select 数据,如果不存在,我需要 select 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);
谢谢!
您不能在 MySQL 中使用 SQL 数据操作语言查询,它在 table 中提到不存在的列。 MySQL 服务器中的查询规划器拒绝它,即使它出现在像 IFNULL()
.
这样的条件上下文中也是如此
您可以使用 UNION ALL
操作,就像这样
SELECT myColumn1, myColumn2, newColumn
FROM newTable
UNION ALL
SELECT myColumn1, myColumn2, NULL as newColumn
FROM oldTable
这将返回 newTable
的行和 oldTable
的行,就像它们是单个 table 一样。它基本上将你的两个 table 隐藏在 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;
如果您恢复数据库但保留代码不变,那么代码和数据库架构之间就会不匹配。最简单的选择是在执行恢复后更改 table 以添加丢失的列。类似于:
ALTER TABLE yourtable ADD newcolumn VARCHAR(255)
显然,将 table、列名称和数据类型更改为适合您的情况的值。
编辑:
您可以通过创建一个存储过程来做一些更接近您实际要求的事情,该存储过程将检查列是否存在并在不存在时添加它:
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所以请先检查存储过程的语法!
我有一个 windows 表单应用程序 (C#),它从 MySQL 数据库中读取一些数据。在新版本中,我需要在 table 之一中添加一个新列(以添加一些功能)。有时我需要制作一个恢复数据库(从转储文件)。如果我从旧数据库(没有新列)恢复旧 table,我会得到 "unnknown column" 错误。
我应该如何将 SQL 命令更改为来自 table 的 select 数据?如果 'newcolumn' 存在,我需要 select 数据,如果不存在,我需要 select 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);
谢谢!
您不能在 MySQL 中使用 SQL 数据操作语言查询,它在 table 中提到不存在的列。 MySQL 服务器中的查询规划器拒绝它,即使它出现在像 IFNULL()
.
您可以使用 UNION ALL
操作,就像这样
SELECT myColumn1, myColumn2, newColumn
FROM newTable
UNION ALL
SELECT myColumn1, myColumn2, NULL as newColumn
FROM oldTable
这将返回 newTable
的行和 oldTable
的行,就像它们是单个 table 一样。它基本上将你的两个 table 隐藏在 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;
如果您恢复数据库但保留代码不变,那么代码和数据库架构之间就会不匹配。最简单的选择是在执行恢复后更改 table 以添加丢失的列。类似于:
ALTER TABLE yourtable ADD newcolumn VARCHAR(255)
显然,将 table、列名称和数据类型更改为适合您的情况的值。
编辑:
您可以通过创建一个存储过程来做一些更接近您实际要求的事情,该存储过程将检查列是否存在并在不存在时添加它:
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所以请先检查存储过程的语法!