我试图使用一个选择语句从某个MySQL表中获得除一个以外的所有列。有什么简单的方法吗?

编辑:在这个表格中有53列(不是我的设计)


当前回答

您可以使用DESCRIBE my_table并使用其结果动态地生成SELECT语句。

其他回答

公认的答案有几个缺点。

当表或列名需要反引号时,该方法失败 如果要省略的列位于列表的最后,则会失败 它需要列出两次表名(一次用于选择文本,另一次用于查询文本),这是多余和不必要的 它可能以错误的顺序返回列名

所有这些问题都可以通过在GROUP_CONCAT的分隔符中包含反勾号并使用WHERE条件而不是REPLACE()来克服。出于我的目的(我想很多人也是如此),我希望列名按照它们在表中出现的顺序返回。为了实现这一点,我们在GROUP_CONCAT()函数中使用了显式的ORDER BY子句:

SELECT CONCAT(
    'SELECT `',
    GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
    '` FROM `',
    `TABLE_SCHEMA`,
    '`.`',
    TABLE_NAME,
    '`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
    AND `TABLE_NAME` = 'my_table'
    AND `COLUMN_NAME` != 'column_to_omit';

我想添加另一个观点来解决这个问题,特别是如果你有少量的列要删除。

您可以使用像MySQL Workbench这样的DB工具来为您生成选择语句,因此您只需手动删除生成语句的那些列,并将其复制到SQL脚本中。

在MySQL Workbench中,生成它的方法是:

右键单击表->发送到Sql编辑器->选择所有语句。

Select *是一个SQL反模式。它不应该在生产代码中使用,原因有很多,包括:

它需要更长的时间来处理。当程序运行数百万次时,这些微小的部分就会产生影响。在缓慢的数据库中,这种缓慢是由这种类型的草率编码引起的,是最难进行性能调优的类型。

这意味着你发送的数据可能比你需要的多,这会导致服务器和网络瓶颈。如果您有一个内部连接,那么发送超过所需数据的可能性是100%。

这会导致维护问题,特别是当您添加了不想到处都看到的新列时。此外,如果您有一个新列,您可能需要对接口做一些事情,以确定对该列做什么。

它可以打破视图(我知道这在SQl server中是真的,在mysql中可能是真的,也可能不是真的)。

If someone is silly enough to rebuild the tables with the columns in a differnt order (which you shouldn't do but it happens all teh time), all sorts of code can break. Espcially code for an insert for example where suddenly you are putting the city into the address_3 field becasue without specifying, the database can only go on the order of the columns. This is bad enough when the data types change but worse when the swapped columns have the same datatype becasue you can go for sometime inserting bad data that is a mess to clean up. You need to care about data integrity.

如果在插入中使用它,如果在一个表中添加了新列,而在另一个表中没有添加,那么它将中断插入。

它可能会破坏触发器。触发问题可能很难诊断。

将所有这些与添加列名所花费的时间加起来(哎呀,你甚至可能有一个允许你拖拽列名的界面(我知道我在SQL Server中这样做,我打赌有一些方法可以做到这一点,你用一些工具来编写mysql查询)。让我们看看,“我可以引起维护问题,我可以引起性能问题,我可以引起数据完整性问题,但是嘿,我节省了5分钟的开发时间。”只需要填入你想要的具体列。

我也建议你读这本书: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1-1&keywords=sql+antipatterns

您可以使用DESCRIBE my_table并使用其结果动态地生成SELECT语句。

(不要在大桌子上尝试,结果可能是……令人惊讶的!)

临时表

DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_a, DROP col_f,DROP col_z;    #// MySQL
SELECT * FROM temp_tb;

DROP语法可能因数据库而异