【问题标题】:Permanent computed field mysql database永久计算域mysql数据库
【发布时间】:2018-12-04 14:21:54
【问题描述】:

我正在尝试用不同的应用程序替换一个应用程序。当替换就位时,我们决定尝试同时使用两者,这意味着让两者都访问同一个数据库。还有一个问题。 AppOld 和 AppNew 访问数据库的同一个表,假设它是一个用户表。 AppOld 有一个名为active 的字段,而AppNew 有一个名为deactivated 的字段。表格的其余部分是相同的。

因此,这是一种丑陋的解决方案,我可以在其中处理对其中一个应用程序的更改,这并不理想,因为我需要更改此应用程序中使用该表的库,而这些库是使用其他代码。或者我需要添加端点,以便一个应用程序可以实际调用另一个应用程序。

最简单的解决方案是 MySQL 中的虚拟字段。类似的东西我可以这样定义:active is not deactivated。这将允许我用一个 ALTER TABLE 来解决这个问题。现在我想知道这是否可能。到目前为止,我找不到任何暗示这是可能的,但最好在增加 6 小时的工作量之前询问。

只是为了澄清:我不能更改 SELECT 语句,因为这些是由 ORM 完成的,而这些 ORM 又在库中,也用于不同的项目。所以,我想添加一个与另一列相反定义的列,而不是保存值。出于同样的原因,我也不能调用存储过程。我认为这是可能的,但请证明我错了。

【问题讨论】:

  • 即使使用 InnoDB 的在线 DDL,也不要介意我的最后一条评论,因为您想存储虚拟列,因此您正在考虑 6 小时的停机时间。此外,您真的需要存储计算/生成的字段吗?跨度>
  • 反正我看不到你最后的评论,所以我不介意。我不需要存储它。但我需要在不更改 ORM 的情况下访问它。我只是在谷歌上搜索了一些,发现生成的虚拟列非常适合我的需要,但是 mysql 说它不知道语法。我现在正在研究触发器。
  • 访问生成的列或由触发器“生成”的列也意味着通过忘记提及的方式更改选择查询。

标签: mysql


【解决方案1】:

好的,我找到了两种方法来完成这项工作:

  1. 生成的列: https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html

我自己无法让它们工作,因为服务器的 MySql 版本低于 5.7,并且仅从 5.7 开始支持。

  1. 触发器 https://www.siteground.com/kb/mysql-triggers-use/

这是一个简短的示例,说明它们的外观。

CREATE TRIGGER ins_check BEFORE INSERT ON user
FOR EACH ROW
SET NEW.active = 1 - NEW.deactivated;

该触发器自动将活动更改为 1 - 停用。看到 deactivated 是 0 或 1,它总是正好相反。我在这里找到了这个巧妙的技巧:https://stackoverflow.com/a/1461135/9094259。以防万一有人想给那个人投票。这确实很好用。但我期待着有一天我可以放弃这些触发器。

干杯!

【讨论】:

  • 如果插入设置了active,但没有设置deactivated,会发生什么?
  • 我也会使用SET NEW.active = NOT NEW.deactivated;,因为我认为这更清楚它们是布尔值。
猜你喜欢
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2015-07-29
  • 2014-08-02
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多