第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將大量記錄插入有關系且沒有重復的數據庫

將大量記錄插入有關系且沒有重復的數據庫

PHP
偶然的你 2021-11-13 10:40:03
我從第 3 方獲得了一些記錄(大約 30k),其結構與此類似(所有字符串):first_name, last_name, city另外我在 MySQL 中有 2 個表:用戶和城市(大約 25k 條記錄)。users 表有一個到城市表的外鍵。我需要users用來自 api 的記錄和citites表的外鍵來填充表。如果城市不存在,我需要創(chuàng)建它。所以我的代碼是這樣的:<?php$users = $api->getUsers();$existingUsers = $this->userRepository->getIds();$existingCities = $this->cityRepository->geIdsIndexedByName();$db->beginTransaction();foreach ($users as $i => $user) {  // if no city with such name, then create new and insert to array  if (!array_key_exists($user['city'], $existingCities) {     $cityId = $db->insert('cities', ['name' => $user['city']]);    $existingCities[$user['city_id']] = $cityId;  }  $user['city_id'] = $existingCities[$user['city']];  if (in_array($user['id'], $existingUsers) { // if record with such id exists, then we update it      $db->update('users', $user);  } else {      $db->insert('users', $user);  }  if (($i % 100) === 0) { // use transactions to avoid mass inserts and updates    $db->commit();    $db->beginTransaction();  }}我不喜歡的是,我必須將所有城市和所有用戶加載到內存中以檢查記錄是否已經存在。我這里不使用 ORM,沒有對象,只有很小的數組,但它仍然會占用資源,我想減少內存消耗。是否有任何實踐可以優(yōu)化該過程?我有一個想法,將 NoSQL 存儲用作現(xiàn)有用戶和引用的緩存,但這是不允許的。
查看完整描述

1 回答

?
MM們

TA貢獻1886條經驗 獲得超2個贊

如果我理解正確,為了將新列表與舊列表匹配,您將必須匹配城市名稱。雖然這并不理想,但它可能是唯一可用的解決方案。


如果您的城市名稱是唯一的,那沒問題。但如果它們不是唯一的(Springfield AK、Springfield CA、Springfield CO、Springfield GA、Springfield ID、Springfield IL、Springfield IN 等),您將需要更多信息來匹配。此外,拼寫錯誤(springfield vs springfiled)將破壞您規(guī)范化數據庫的原因......


第一步,將新信息添加到新表中。我將其稱為新信息...


newinfo

----------

first_name

last_name

city

因此假設城市名稱是唯一的,下一步是將所有新的唯一城市名稱添加到cities. 如果你有一個唯一的索引cities.name,你可以簡單地


insert ignore into cities('name') select city from newinfo  

否則,您必須加入表以查找新值:


insert into cities ('name') 

select newinfo.city 

from newinfo 

left join cities on newinfo.city=cities.name 

where cities.name is null

現(xiàn)在您的cities表中有所有可能的城市,您需要插入所有新名稱??紤]如何獲取需要插入的信息:


select newinfo.first_name, new info.last_name, cities.id 

from newinfo 

inner join cities on new info.city=cities.name

然后,當您對獲得正確的數據感到滿意時,插入它:


insert into users 

values('first_name','last_name','city_id') 

select newinfo.first_name, new info.last_name, cities.id 

from newinfo 

inner join cities on new info.city=cities.name 

現(xiàn)在您已經完成了表 newinfo 并且可以將其刪除。


查看完整回答
反對 回復 2021-11-13
  • 1 回答
  • 0 關注
  • 184 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號