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

Jos*_*ine 6 mariadb terminology mariadb-10.3

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

可以INVISIBLECREATE TABLEorALTER TABLE语句中为列指定属性。这些列将不会列在语句的结果中SELECT *,也不需要在 INSERT语句中为它们分配值,除非INSERT通过名称明确提及它们。

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

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

Eva*_*oll 3

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

  1. 切勿使用INVISIBLE色谱柱。
  2. 切勿SELECT *在生产代码中使用。
  3. 始终通过加密或SQL 标准列级权限来保护您不希望其他人访问的列。

MariaDB 的INVISIBLE专栏

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

CREATE TABLE users ( id INT, username varchar(255) );
Run Code Online (Sandbox Code Playgroud)

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

ALERT TABLE users
  ADD COLUMN password varchar(255) INVISIBLE;
Run Code Online (Sandbox Code Playgroud)

事后,ADD COLUMN你仍然非常安全,但没有意识到在这种情况下没有一个头脑正常的人会使用它SELECT *

虽然只有一种类型的不可见性暴露给用户,但 MariaDB 内部有四种不同类型的不可见性。有关详细信息,请参阅MDEV-10177 不可见列隐形也有效果INSERT,请在门票上找到更多信息

其他数据库

顺便说一句,Oracle 称之为此功能INVISIBLEDB2 称之为IMPLICITLY HIDDEN。在不支持此功能的其他 SQL 方言中,您只需创建一个VIEW,

CREATE user_view AS SELECT id, username FROM users;
Run Code Online (Sandbox Code Playgroud)