[英]How to insert a new record if old record is updated?
我正在使用mysql作為php應用程序的數據庫。
我必須解析一個csv工作表,並且僅在更新舊記錄時才將數據插入數據庫。
一種方法是使用我在csv中擁有的ID從數據庫中獲取記錄,然后檢查值,如果存在差異,則添加新記錄,但是由於我有數百MB的數據,因此我無法從中來回執行此操作數據庫,有沒有一種方法可以完全在sql中完成呢?
ID不是唯一的,必須插入的新記錄將使用相同的ID。
例如,以下是當前記錄
| 1001 | M丹麥語| 新加坡|
以及國家/地區對美國的更改,表格將有兩行,如下所示
| 1001 | M丹麥語| 新加坡|
| 1001 | M丹麥語| 美國|
正如我從您的問題中了解到的那樣,您可以在將csv數據插入數據庫檢查該記錄之前,對數據庫表名稱的“更新”值0或1(false或true)進行另一個原始處理,然后將其作為值(false或true)進行操作)
就相對成本而言,到數據庫的往返通常非常昂貴。 面對這種情況時,我通常嘗試存儲一個帶有要比較的值的本地映射(即帶有字符串鍵的PHP數組),從而使我只能往返DB所需的更新/插入。
為了說明起見,這是一個過於簡化的示例:
// variable created in php file from previous run
$records = [
"1001 | M Danish | Singapore" => true
// ... other records
];
// check if value present, a constant time operation on a map
if (!isset($records["1001 | M Danish | USA"])) {
// insert into db
}
值得注意的是,上面的示例並沒有遍歷所有記錄,處理重復的鍵,刪除了舊鍵等。但是,希望它為您提供了一個總體思路,可以大大減少數據庫往返次數(或一次往返的總大小),方法是:在進行查詢之前,先在PHP中做一些快速工作。
將自動遞增ID添加到表中。 然后在php中運行查詢以選擇與csv中的行匹配的最后一個ID。 比較兩者,如果有差異則插入。 這是我想到的表結構最有效的方法。
我會創建一個數據不變的表和一個具有重復id(csv Id)的表,僅在更改時才插入。 這將使您的工作變得輕松快捷。 第二個表將具有自動遞增的ID,以檢查與csv中的ID是否相同的最后一行。
希望清楚。
您可以對重復的密鑰更新sql運行插入忽略。 僅當您在要唯一的列中定義了唯一鍵時,此方法才有效
insert ignore into table1(col1, col2)
values ('val1', 'val2')
on duplicate key update
col1 = VALUES(`col1`),
col2 = VALUES(`col2`)
這將更新值為val1,val2的行,或者如果未找到行則插入
如果您有大量插入內容/更新內容,則可以批量使用
insert ignore into table1(col1, col2)
values
('val1', 'val2'),
('val3', 'val4'),
('val5', 'val6'),
('val7', 'val8'),
('val9', 'val10'),
('val11', 'val12'),
('val13', 'val14')
on duplicate key update
col1 = VALUES(`col1`),
col2 = VALUES(`col2`)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.