【问题标题】:Let a metadata table automatically match all columnnames from original table in MariaDB让元数据表自动匹配 MariaDB 中原始表的所有列名
【发布时间】:2021-04-14 05:24:06
【问题描述】:

在我的数据库中,我有一个包含很多列的大表,其中每一行代表一个数据集。 (“表1”)

我创建了第二个表(“Table2”),它用作 Table1 的元数据表。除了添加了主键之外,所有列都是相同的。

主要区别在于该表中的每一行都代表一个视图,其中包含 Table1 的所有列的元数据

小例子:

Table1
Column1  Column2  Column3
      1     True    "Foo"
      2    False    "Bar"  
      3    False    "Baz" 
Table2
View_name  Column1  Column2  Column3
  "admin"   "show"   "show"   "show"
  "sales"   "show"   "hide"     null
"default"   "hide"   "show"   "hide"

我现在正在寻找一种在 Table1 更改时自动更新 Table2 的方法。所以:

  • 如果 Table1 添加了 Column4,则将 Column4 添加到 Table2(视图的值可以是 null)。
  • 如果 Table1 删除了 Column3,请从 Table2 中删除 Column3
  • 如果 Table1 将 Column2 的名称更改为 Col2,则将 Table2 中的 Column2s 名称更改为 Col2

当然,同时不会为所有这些操作覆盖表 2 中的任何现有值。

我希望编写某种TRIGGER 函数,但作为替代方案,我不介意运行不时执行此操作的查询。我只是不想手动管理这些更改。

有什么办法吗?

【问题讨论】:

  • 删除是什么意思?您可以删除列或删除列中的值。 mysql也不支持ddl触发器,所以ALTERing a table to add a column不能触发触发器,
  • 我的意思是删除一列。抱歉,我对 SQL 还很陌生,正在尝试掌握行话
  • 简单回答不,你不能自动化。

标签: mysql sql mariadb


【解决方案1】:

使用您在列中存储数据的方式无法实现自动化。

也许这是您应该以不同方式存储数据的线索。

另一个线索是更改发生得如此频繁,以至于您需要自动添加和删除列!

这是一个例子:

Table1 
 dataset attribute value
      1    col2    True
      1    col3    'Foo'
      2    col2    False
      2    col3    'Bar'
      3    col2    False
      3    col3    'Baz'

这也称为实体-属性-值表。它也有很多缺点,但它的优点是您可以通过插入或删除行来添加或删除属性。

但您还需要一个表格来记录您允许的规范属性集。

Metadata
 attribute type    default
   col2     bool    False
   col3     string  ''

在此表中,添加新属性也只是插入。您可以将第一个表中的属性设为cascading foreign key,因此如果您从元数据表中删除一行,它会自动删除引用它的匹配行。

您还需要一个表格来注释每个视图中要包含哪些属性:

Viewership
 view    attribute  show
 'admin'     col1   True
 'admin'     col2   True
 'admin'     col3   True
 'sales'     col1   True
 'sales'     col1   False
 'sales'     col1   False
'default'    col1   False
'default'    col2   True
'default'    col3   False

如果您添加新属性,您仍然需要手动将 插入此表。但这比添加列要容易。

您也许可以使用触发器自动执行此操作,因此当您向元数据表插入新行时,它会为该表的每个视图添加一行。但根据我的经验,使用触发器是不值得的。只需在您的应用程序中这样编码即可。

(你还应该假设一个属性如果添加到视图表中失败,默认情况下它是隐藏的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多