[英]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.