AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 212227
Accepted
Sybil
Sybil
Asked: 2018-07-15 10:54:46 +0800 CST2018-07-15 10:54:46 +0800 CST 2018-07-15 10:54:46 +0800 CST

什么是“隐形列”以及它们是如何使用的?

  • 772

我在 MariaDB 10.3.x 中看到了一个新功能Invisible Columns 。DBA 和 Web 开发人员的实际用例是什么?何时使用此功能?

可以在or语句中为列赋予INVISIBLE属性。然后这些列将不会在语句的结果中列出,也不需要在 语句中为它们分配值,除非通过名称明确提及它们。CREATE TABLEALTER TABLESELECT *INSERTINSERT

由于SELECT *不返回不可见列,因此以这种方式创建的新表或视图将没有不可见列的踪迹。如果在语句中特别引用SELECT,列将被带入视图/新表,但INVISIBLE 属性不会。

不可见列可以声明为NOT NULL,但需要一个 DEFAULT值

terminology mariadb
  • 2 2 个回答
  • 4113 Views

2 个回答

  • Voted
  1. dbdemon
    2018-07-16T15:18:13+08:002018-07-16T15:18:13+08:00

    这是我了解 MariaDB 10.3 中的不可见列功能几天后出现的一个实际用例:

    根据一项新要求,我在我们的一张大桌子中间添加了一个新列。(这可以由多个不同的应用程序访问。)虽然这是一种即使在最糟糕的噩梦中也不会导致问题的琐碎任务,但这正是发生的事情。

    我不知道的是,我们有一些“创新”的遗留代码正在SELECT *针对该特定表(以及其他几个,事实证明)执行,然后根据当时存在的列名和列顺序填充一组变量。最终结果是用户界面中显示了错误的值,给用户造成了很大的困惑。

    我可以通过使列“不可见”在几分钟内解决这个问题,但由于我们仍在运行 10.2,这不是一个选项,所以我们决定通过修补和重新部署软件来走硬路线。如果我们无法访问源代码或由于其他原因无法修改代码,那么升级到 10.3 可能是我们唯一的选择。

    因此,虽然 SQL 标准未涵盖此功能,但它在极少数情况下仍然很有用。

    • 4
  2. Best Answer
    Evan Carroll
    2018-07-15T11:23:54+08:002018-07-15T11:23:54+08:00

    这当然不是标准的 SQL,而且通常很愚蠢。而是遵循最佳实践,

    1. 永远不要使用INVISIBLE列。
    2. 永远不要SELECT *在生产代码中使用。
    3. 始终使用加密或SQL 标准列级权限保护您不希望其他人访问的列。

    MariaDB 的INVISIBLE专栏

    似乎其目的是允许 MariaDB 用户继续使用SELECT *,这几乎总是违反 DBA 的最佳实践。所以现在你可以使用SELECT *, 然后添加到表中而不改变 . 返回的结果SELECT *。

    CREATE TABLE users ( id INT, username varchar(255) );
    

    而且你有一个出口users转储SELECT *。稍后如果您想添加一列,您可以将其标记为INVISIBLE并维护结果

    ALERT TABLE users
      ADD COLUMN password varchar(255) INVISIBLE;
    

    后-ADD COLUMN您仍然非常安全,而无需知道在这种情况下没有人会使用他们的正确思想SELECT *。

    尽管只向用户公开了一种类型的不可见性,但 MariaDB 内部有四种不同类型的不可见性。有关详细信息,请参阅MDEV-10177 隐形列。隐身也有效果INSERT,请在机票上找到更多信息

    其他数据库

    顺便说一句,Oracle 称这个特性INVISIBLE为,而DB2 称它为IMPLICITLY HIDDEN。在其他不支持此功能的 SQL 方言中,您只需创建一个VIEW,

    CREATE user_view AS SELECT id, username FROM users;
    
    • 2

相关问题

  • 在 SQL 中,它是复合键还是复合键?

  • 什么是残差谓词?

  • “‘连接’表”是否与弱实体相同?

  • 软件工程师和 DBA [关闭]

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve