最近接手一個公司外包維護,他們系統有一些資料處理使用的是Mysql的存盤程序定時執行來實作的。最近這幾天這個存盤程序雖然每天都有執行,但全都失敗了。
手動執行時有一些回傳: 1364 - Field 'shop_id' doesn't have a default value。
問題是這個存在程序是通過把一個主表連接兩個附表里的資料按過濾條件取出來,然后插入到一個新表里。
這個取的程序如果直接在命令列是正常的,大概資料是230W條左右。表里資料大概有2億多點。
它執行報的這個錯誤這個取出來的shop_id不可能是沒有值的,我單獨執行存盤程序的SELECT操作,然后按shop_id排序的都是有值的。
有人知道這是為什么嗎?現在這個存在程序從前兩天開始已經沒法正常執行了。前些天資料大概在150W左右時還能正常執行。現在200W時就執行不下去了。
存盤程序代碼:
BEGIN
/*
** Step 1
** 名稱:Temp
** 引數:無
*/
DECLARE
#a date DEFAULT DATE_SUB(CURDATE(),INTERVAL 1 DAY); # "2017-11-12"
a date DEFAULT "2018-11-12";
DECLARE staffds INT DEFAULT 18000 ; -- 默認當日在線時長超過5小時即為店員
DECLARE outshops INT DEFAULT 0 ; -- 默認當日在線時長少過60秒的即為店外流量
WHILE
a < CURDATE( ) DO
INSERT INTO shuibei_lbs.LBS_MessData ( TransactionDate, shop_id, ApMac, ClientMac, ClientDeviceBrand, EnterTime, Exittime, Inshop, DurationSecond ) SELECT
DATE( A.EnterTime ) AS TransactionDate,
# B.remarks,
B.shop_id,
upper( A.EnterSensorMac ) AS ApMac,
Upper( A.ClientMac ),
"" AS ClientDeviceBrand,
A.EnterTime,
A.ExitTime,
CASE
WHEN A.Rssi >= B.device_rssi
THEN
1 ELSE 0
END,
TIME_TO_SEC( TIMEDIFF( A.ExitTime, A.EnterTime ) ) AS DurationBySecond
FROM
shuibei_lbs.LBS_CustomerRegionEvent A,
shuibei_lbs.shop_device B
WHERE
DATE_FORMAT( A.EnterTime, "%Y-%m-%d" ) = a
AND upper( A.EnterSensorMac ) = B.device_mac
# AND A.Rssi >= B.device_limit_rssi
#and TIME_TO_SEC( TIMEDIFF( A.ExitTime, A.EnterTime ) ) > outshops
ORDER BY
EnterTime;
-- 更新設備品牌
UPDATE shuibei_lbs.LBS_MessData A,
shuibei_lbs.oui B
SET A.ClientDeviceBrand = LEFT ( B.CompanyName, 200 )
WHERE
upper( LEFT ( A.ClientMac, 8 ) ) = B.MAC
AND TransactionDate = a;
-- 篩選出職員清單
INSERT INTO shuibei_lbs.StaffList (ClientMac)
SELECT
distinct TempT.ClientMac
from (SELECT TransactionDate,shop_id,ClientMac, sum(DurationSecond) DS
FROM shuibei_lbs.LBS_MessData
where TransactionDate = a
group by TransactionDate, shop_id, ClientMac
order by TransactionDate, shop_id, ClientMac) TempT
WHERE TempT.DS >= staffds
and TempT.ClientMac not in (select distinct ClientMac from shuibei_lbs.StaffList);
SET a = DATE_ADD( a, INTERVAL 1 DAY );
END WHILE;
END
uj5u.com熱心網友回復:
看了下存盤程序大概分三步,插入資料,更新資料,再插入資料;建議手動執行三個SQL陳述句,查看哪條SQL報錯,根據你描述的應該是第一條SQL;
你查一下select * from b where shop_is null; 看真的是否有空值
如果還有沒建議你把插入的SELECT陳述句單獨執行,不要用肉眼看,加個條件 where shop_id is null;
查看是否會真的產生空值。
如果都排除了,剛才看了下其他人1364經驗,是這樣說的:
修改SQL_MODE
但不建議,你是把不規范的值插入到了表中,才會報這個錯誤。
看SHOP_ID欄位長度,
然后把SELECT 陳述句生成的SHOP_ID你再LENGTH一下,是不是有人手動輸入錯誤,導致字度過長插入不進去。
建議還是從SHOP_id這列資料入手,查找不規范的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/78233.html
標籤:MySQL
上一篇:mysql存盤程序的分組統計
下一篇:[MySQL][ODBC 5.2(a) Driver][mysqld-8.0.11]Query execution was interrupted
