在MySQL中选择除一列之外的所有列?

462

我正在尝试使用select语句获取某个MySQL表中除了某一列之外的所有列。有没有简单的方法可以做到这一点?

编辑:该表中有53个列(不是我设计的)。


6
53个列?在这种情况下,我会像Thomas建议的那样坚持使用SELECT *...除非额外的列有大量数据需要检索,这可能不是我们想要的。 - Mike Stone
1
除了一列...我想你知道应该忽略哪一列,因此INFORMATION_SCHEMA.columns是正确的方式。 - Alfabravo
3
常见用途是排除自动递增的ID列。例如,选择要插入到另一个具有自己ID的表中的数据。 - ToolmakerSteve
4
常见的用法是在检索用户信息时排除密码哈希值。 - Gianluca Ghettini
4
老实说,没有简单的方法来做这件事情,这相当荒谬。 - Enerccio
显示剩余3条评论
33个回答

0
如果您使用MySQL Workbench,可以右键单击表格,然后单击“发送到SQL编辑器”,接着选择“选择所有语句”。这将创建一个包含所有字段的语句,如下所示:
SELECT `purchase_history`.`id`,
    `purchase_history`.`user_id`,
    `purchase_history`.`deleted_at`
FROM `fs_normal_run_2`.`purchase_history`;
SELECT * FROM fs_normal_run_2.purchase_history;

现在你可以只删除那些不想要的。


-2

我回答这个问题有点晚了,但这是我一直以来的做法,坦白说,它比最佳答案好100倍,也更整洁。我只希望有人能看到它并觉得有用。

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);

它可能很整洁,但不回答问题:他没有询问关于PHP的事情,你也没有给出一个选择语句或他想要的结果,只是一个包含他想要的列的PHP数组。 - gou1
3
这不是SQL代码,这里没有SELECT语句--甚至连这个词都没有出现。 - Frungi
只有在以下情况下才更整洁:(a) 你比 SQL 更熟悉 PHP,或者 (b) 你喜欢将代码分散到多行以提高可读性。我会认同第二点。虽然在许多用例中差异微不足道,但你的方法也会导致性能下降。另请参阅有关您问题的其他评论。这并不值得大惊小怪,建议您从原始问题中删除不适当的评论。 - mc0e

-8

Select * 是 SQL 的反模式。出于许多原因,它不应该在生产代码中使用,包括:

它需要更长的处理时间。当事情运行数百万次时,这些微小的差别可能很重要。一个由此类粗糙编码引起的缓慢数据库是最难进行性能调整的。

这意味着您可能会发送比所需更多的数据,从而导致服务器和网络瓶颈。如果您有内部连接,则发送比所需更多的数据的机会为100%。

它会导致维护问题,特别是当您添加了新列但不希望在所有地方都看到时。此外,如果您有一个新列,您可能需要对接口进行一些操作以确定如何处理该列。

它可能会破坏视图(我知道在 SQL Server 中是这样,但在 MySQL 中可能是真实的也可能不是)。

如果有人愚蠢到以不同的顺序重建表格(尽管你不应该这样做,但这种情况时有发生),那么各种代码都可能出现问题。特别是在插入例子中,如果没有指定,数据库只能按照列的顺序进行操作,所以突然间你会把城市名放到地址_3字段中。当数据类型改变时,这已经很糟糕了,但当交换的列具有相同的数据类型时,就更糟糕了,因为你可能会一段时间内插入错误的数据,而清理起来非常麻烦。你需要关心数据完整性。
如果在插入操作中使用它,如果在一个表中添加了新的列而另一个表没有添加,插入操作将会出错。
它可能会破坏触发器。触发器问题可能很难诊断。
综合考虑所有这些与添加列名所需的时间(哪怕你甚至可以使用界面拖动列名,我知道SQL Server中有这样的功能,我敢打赌你使用的某个写MySQL查询的工具也有类似的方法)。想想看,“我可能会引起维护问题、性能问题和数据完整性问题,但我省了五分钟的开发时间。”真正的解决办法就是只添加你需要的具体列名。
我还建议您阅读这本书: 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接