【问题标题】:Best way to handle duplicated rows处理重复行的最佳方法
【发布时间】:2020-09-12 00:05:56
【问题描述】:

我的数据库中有保险公司“字典”,比如说:

+----+-------------------+----------+
| ID | Name              | Data     |
+----+-------------------+----------+
| 1  | InsuranceCompany1 | SomeData |
+----+-------------------+----------+

但是我从另一个系统获取数据,结果我得到了保险公司的副本,但没有我的数据:

+----+-------------------+----------+
| ID | Name              | Data     |
+----+-------------------+----------+
| 1  | InsuranceCompany1 | SomeData |
+----+-------------------+----------+
| 2  | InsuranceCompany1 |          |
+----+-------------------+----------+

两条记录在各种模型中相关,但它们引用相同的数据,我想要的是配对这些记录而不更改其他表中的查询或数据,所以没人知道有两条记录,但都引用一个实例是

 +----+-------------------+----------+
 | 1  | InsuranceCompany1 | SomeData |
 +----+-------------------+----------+

我的问题是:是否有一些适当的方法来处理这种情况? 我想出了解决方案,即添加 parent_id 列,并在重复的行中手动设置 parent_id,然后在模型中覆盖 Eloquent 方法,如 find 如果设置了 parent_id,则返回 parent。

复制 SomeData 列不是一个选项,因为insurance_company_id == id; 可能存在条件

【问题讨论】:

    标签: mysql laravel eloquent duplicates


    【解决方案1】:

    您可以尝试创建dict 表的视图,如下所示:

      CREATE VIEW unique_dict AS
      SELECT MIN(ID) ID,
             Name,
             GROUP_CONCAT(Data) Data
        FROM dict
       GROUP BY Name
    

    这将为您提供每个名称一行。

    然后,在每个名称需要一行的查询中,从 unique_dict 视图而不是 dict 表中选择。

    GROUP_CONCAT() 会从Data 中生成一个值列表,如果有多个重复行包含一个值,这会有所帮助:您可以获得所有值。

    从长远来看,您可能明智地认为这些重复数据是“脏数据”,并在您插入新行时清理它们。该怎么做?

    Name 上创建唯一索引。

    CREATE UNIQUE INDEX unique_name ON dict(Name);
    

    然后,在将新数据加载到 dict 时,请使用 Eloquent 的 updateOrCreate() 函数。这里有一些关于这方面的内容。 Laravel 5.1 Create or Update on Duplicate

    【讨论】:

    • 很好,我试试。
    猜你喜欢
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2013-04-30
    • 2014-12-05
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多