簡體   English   中英

如何在MySQL表中添加新行時實時檢查

[英]How to check in real-time if new row was added to MySQL table

我們有一個自動車牌閱讀器,記錄汽車車牌進入公司。 我的同事問我是否可以立即獲得汽車的車牌號碼。 該軟件使用MySQL,我只有數據庫訪問權限。 無法訪問/編輯PHP代碼。

我的提議是定期檢查使用查詢。 例如10秒。 但通過這種方式,可能會錯過5秒鍾內的車輛。 然后減少間隔會增加請求/響應計數,這意味着服務器的額外負載。 我不希望腳本始終運行。 它應該只運行一個新的db行。 它顯示了板和出口。

如何在插入后立即從db獲取最后記錄的行? 我的意思是應該有插入后運行我的PHP腳本的觸發器。 但是我不知道。

我想要的是MySQL可以在新記錄之后運行我的PHP腳本。

如果你的桌子是MyISAM,我會堅持你最初的想法。 從MyISAM表中獲取行計數是即時的。 它只需讀取一個值,因為MyISAM始終保持行數。

使用InnoDB,這種方法仍然可以接受。 假設car_table.id是主鍵, SELECT COUNT(id) FROM car_table只需要索引掃描,這非常快。 您可以通過向表中添加另一個索引布爾列來改進此想法:

ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);

默認值可確保在不修改插入語句的情況下將此標志設置為0來插入新車。 然后:

BEGIN TRANSACTION; -- make sure nobody interferes
SELECT COUNT(checked) FROM car_table WHERE checked = FALSE FOR UPDATE; -- this gets you the number of new, unchecked cars
UPDATE car_table SET checked = TRUE WHERE checked = FALSE; -- mark these cars as checked
COMMIT;

這樣,您只能在每次輪詢時掃描非常少量的索引條目。

更高級的方法包括通過觸發器將新創建的汽車ID添加到邊桌中。 不時地掃描該邊桌,而不鎖定主桌,並且不改變其結構。 每次輪詢后,只需TRUNCATE此邊桌。

最后,正如Panagiotis所建議的,可以選擇觸發UDF,但在大多數情況下這似乎是一種過度殺傷力。

雖然這不是最好的設計,但我還沒有實現它,有辦法通過sys_exec()UDF使用觸發器調用外部腳本,如下所述:

B.5.11:觸發器可以通過UDF調用外部應用程序嗎?

是。 例如,觸發器可以調用sys_exec()UDF。

http://dev.mysql.com/doc/refman/5.1/en/faqs-triggers.html#qandaitem-B-5-1-11

還可以看看這個類似於您需求的線程。

從MySQL觸發器調用PHP腳本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM