我在 MariaDB 10.3.x 中看到了一个新功能Invisible Columns 。DBA 和 Web 开发人员的实际用例是什么?何时使用此功能?
可以在or语句中为列赋予
INVISIBLE
属性。然后这些列将不会在语句的结果中列出,也不需要在 语句中为它们分配值,除非通过名称明确提及它们。CREATE TABLE
ALTER TABLE
SELECT *
INSERT
INSERT
由于
SELECT *
不返回不可见列,因此以这种方式创建的新表或视图将没有不可见列的踪迹。如果在语句中特别引用SELECT
,列将被带入视图/新表,但INVISIBLE
属性不会。不可见列可以声明为
NOT NULL
,但需要一个DEFAULT
值
这是我了解 MariaDB 10.3 中的不可见列功能几天后出现的一个实际用例:
根据一项新要求,我在我们的一张大桌子中间添加了一个新列。(这可以由多个不同的应用程序访问。)虽然这是一种即使在最糟糕的噩梦中也不会导致问题的琐碎任务,但这正是发生的事情。
我不知道的是,我们有一些“创新”的遗留代码正在
SELECT *
针对该特定表(以及其他几个,事实证明)执行,然后根据当时存在的列名和列顺序填充一组变量。最终结果是用户界面中显示了错误的值,给用户造成了很大的困惑。我可以通过使列“不可见”在几分钟内解决这个问题,但由于我们仍在运行 10.2,这不是一个选项,所以我们决定通过修补和重新部署软件来走硬路线。如果我们无法访问源代码或由于其他原因无法修改代码,那么升级到 10.3 可能是我们唯一的选择。
因此,虽然 SQL 标准未涵盖此功能,但它在极少数情况下仍然很有用。
这当然不是标准的 SQL,而且通常很愚蠢。而是遵循最佳实践,
INVISIBLE
列。SELECT *
在生产代码中使用。MariaDB 的
INVISIBLE
专栏似乎其目的是允许 MariaDB 用户继续使用
SELECT *
,这几乎总是违反 DBA 的最佳实践。所以现在你可以使用SELECT *
, 然后添加到表中而不改变 . 返回的结果SELECT *
。而且你有一个出口
users
转储SELECT *
。稍后如果您想添加一列,您可以将其标记为INVISIBLE
并维护结果后-
ADD COLUMN
您仍然非常安全,而无需知道在这种情况下没有人会使用他们的正确思想SELECT *
。尽管只向用户公开了一种类型的不可见性,但 MariaDB 内部有四种不同类型的不可见性。有关详细信息,请参阅MDEV-10177 隐形列。隐身也有效果
INSERT
,请在机票上找到更多信息其他数据库
顺便说一句,Oracle 称这个特性
INVISIBLE
为,而DB2 称它为IMPLICITLY HIDDEN
。在其他不支持此功能的 SQL 方言中,您只需创建一个VIEW
,