簡體   English   中英

處理重復行的最佳方法

[英]Best way to handle duplicated rows

我的數據庫中有保險公司的“字典”,比如說:

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

但是我從另一個系統獲取數據,結果我得到了保險公司的副本,但沒有我的數據:

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

兩條記錄在各種模型中都相關,但它們引用相同的數據,我想要的是配對這些記錄而不更改其他表中的查詢或數據,所以沒有人知道有兩條記錄,但都引用一個實例,即

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

我的問題是:是否有一些適當的方法來處理這種情況? 我想出了解決方案,即添加 parent_id 列,並在重復的行中手動設置 parent_id,然后覆蓋 Eloquent 方法,如在 model 中找到方法,如果設置了 parent_id,則返回父級。

復制 SomeData 列不是一種選擇,因為如果insurance_company_id == id;

您可以嘗試創建dict表的視圖,如下所示:

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

這會給你每個名字一行。

然后,在每個名稱需要一行的查詢中,SELECT 來自unique_dict視圖而不是dict表。

GROUP_CONCAT()Data中產生一個值列表,如果有多個重復的行包含一個值,這會有所幫助:你得到它們。

從長遠來看,您可能明智地將這些重復項視為“臟數據”,並在您插入新行時清理它們。 怎么做?

Name上創建唯一索引。

CREATE UNIQUE INDEX unique_name ON dict(Name);

然后,在將新數據加載到dict時,使用 Eloquent 的updateOrCreate() function。 這是一些值得閱讀的內容。 Laravel 5.1 創建或更新重復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM