insert into etcvehiclerecord(userId,vehicleId,obuid,cardid)
select distinct o.userId , o.vehicleId ,o.id obuid ,c.id cardid from
obuupload o
left JOIN cardupload c ON o.vehicleId = c.vehicleId and o.userId =c.userId
left JOIN vehicleupload v ON o.vehicleId = v.id and o.userId =v.userId;
3個表,組合查詢,查詢出來4個欄位,該4個欄位組成序列唯一,其中某個欄位因為可能為NULL,所以這4個欄位無法組成聯合索引。
歷史的資料,可以用這個腳本查出來。但是增量的資料怎么增加呢?
一種辦法,就是代碼的方式,先把所有的序列查出來,然后挨個判斷4欄位序列。
如果新的序列是4個欄位全部為非空,且表里面沒有則新增。
如果新的序列是4個欄位全部為非空,但表里面有一個序列某欄位為空的。把之前的存在某欄位為空的序列刪掉,把新的4序列入庫。
如果新的序列是4個欄位,部分欄位為空(是新辦的),直接入庫。
但是這個比較麻煩,想問下大家有沒有直接用sql腳本的方式來做?
uj5u.com熱心網友回復:
換了一下思路。把這4個序列弄成主鍵 ,以后更新時用insert ignore into 的方式來了。
uj5u.com熱心網友回復:
insert into etcvehiclerecord(userId,vehicleId,obuid,cardid)select distinct o.userId , o.vehicleId ,o.id obuid ,c.id cardid from
obuupload o
left JOIN cardupload c ON o.vehicleId = c.vehicleId and o.userId =c.userId
left JOIN vehicleupload v ON o.vehicleId = v.id and o.userId =v.userId
where not exists (
select 1 from etcvehiclerecord e where concat_ws(',',e.userId,e.vehicleId,e.obuid,e.cardid) = concat_ws(',',o.userId , o.vehicleId ,o.id obuid ,c.id cardid)
)
concat_ws里面的欄位,如果是空值,要用空字串表示,不能用null,不然可能會有錯誤。例如concat_ws(',','1',null,'2')='1,2',concat_ws(',','1','','2')='1,,2',然后你這個insert ignore into也要看看有沒有空值的問題
uj5u.com熱心網友回復:
之所以用concat_ws不用concat是因為concat如果有一個值是null,則整個結果都是null,concat_ws就沒有這種情況。然后concat_ws中的欄位,如果不想去修改表中的null為空字串,可以每個欄位都加ifnull(user_id,''),就是執行可能會慢一點轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/7130.html
標籤:MySQL
