我正在运行MySQL 5.6。我有很多不同的名字"数据库中的列(在各种表中)。每个客户每年都会将这些导入作为CSV数据转储导入。这个网站上有很多地方可以显示这些名称。问题是,名称几乎没有格式化(到目前为止,输入时不存在清理):
Phil Eaton, PHIL EATON, Phil EATON, etc.
因此,当涉及这些名称时,网站有时看起来像一团糟。我可以通过多种方式来做到这一点,但没有一种方法特别有吸引力。
首先,我可以在Javascript中使用过滤器。但是,正如我所说,这些名称存在于这个(大型)网站的许多地方。我可能最终错过了一个页面。这些名称在nice" name" -classed divs / spans等中已不存在。
其次,我可以在PHP(后端)中进行过滤。这似乎与在Javascript中执行它一样有效。我可以在API上执行此操作,但仍然没有从数据库中提取名称的中心方法。所以我仍然可以错过API调用。
最后,显而易见的"最佳"方法是清理每个名称列的现有数据。然后,同时,每次添加客户时,立即开始清理所有导入的名称。第一部分的问题是数据库中有数亿行名称。更新这些可能需要花费很长时间,并且会对客户产生破坏性影响。日常生活。
因此,在短期内纠正此问题最具吸引力的方法是每次选择一列时调用一个函数。通过这种方式我可以装饰"每个具有格式化功能的名称列,因此名称将在前端显示为统一。所以最终,我的问题是:是否可以在每次选择特定列时调用SQL中的特定函数来格式化每一行?换句话说,每次选择一列时,我可以调用存储过程吗? (重点是,我试图在SQL中保留格式以避免使用的传播。)
答案 0 :(得分:1)
在MySQL中,你不能在SELECT上触发某些东西,但我有一个想法(这只是一个想法,现在我没有时间去尝试,抱歉)。
您可能可以在此表上创建一个具有相同结构的VIEW,但将存储过程应用于names字段,并从PHP中的此视图中进行选择。
但它有两个退回:
另一方面,我同意HLGEM,我还建议在导入时格式化数据,因为导入你没有检查到数据库的东西是非常糟糕的做法(SQL注入?)。批处理任务也是清理混乱的好主意。
答案 1 :(得分:0)
我认为频繁调用名称,因此每次调用它们时都会调用清理函数,这会严重降低系统速度。此外,您不能只是做一个简单的设置来实现这一点,您必须更改包含名称的每个运行的SQL代码。
我个人如何处理它是修复导入,因此他们为新名称添加了一个已清理的版本。在没有某种分段和清理的情况下直接将任何数据放入数据库是一个坏主意。
然后我会解决旧名称,并在每晚使用该系统时安排的夜间运行中批量修复它们。您必须在开发人员上进行一些测试,以确定在不干扰数据库正在执行的其他操作的情况下可以运行的批处理量。更快地通过所有名称来更新批次,但即使这需要时间,这也是确保清理数据的最可靠方法,随着时间的推移,数据对用户来说会更好。如果数据库的设计允许您识别哪些是更活跃的名称(例如客户的is_active标志或去年的订单),我会优先考虑更新。或者,您可以一次清理一个客户端,无论哪个人注意到问题并推动此更改。
答案 2 :(得分:0)
其他答案之前给出一些可能的解决方案。但是,你要问的具体方案的简短答案是:不。没有这样的东西叫做a “选择语句触发器”,对于单个列也是如此,尽管触发器接近这种期望,但仅适用于插入,更新和删除操作。