2017-06-21 64 views
0

好吧,我目前正在開發一個網站,應該有一個可搜索的泳池水泵數據庫。作爲這個系統的一部分,爲了防止人們閱讀隱藏的數據,我使用隨機生成的池泵庫存的主鍵。以下是我爲MariaDB後端編寫的代碼:如何獲取MariaDB/MySQL中插入行的隨機生成主鍵?

DELIMITER $$ 
CREATE TRIGGER random_pump_id BEFORE INSERT ON tbl_stock FOR EACH ROW 
    BEGIN 
    DECLARE temp_id MEDIUMINT; 
    REPEAT 
     SET temp_id = FLOOR(RAND() * 16777216); 
    UNTIL (SELECT COUNT(*) FROM tbl_stock WHERE pump_id = temp_id) <= 0 END REPEAT; 
    SET NEW.pump_id = temp_id; 
    END 
$$ 

但是現在我遇到了兩難困境。每次我想插入一行時,我需要一種方法來檢索我剛剛生成的主鍵。我知道如果我使用AUTO_INCREMENT,我可以在PDO中使用LAST_INSERT_ID函數或lastInsertId。但由於我沒有使用AUTO_INCREMENT,而是使用了單獨的觸發器,所以這些函數只會返回0.我知道我可以在PostgreSQL中使用RETURNING子句來完成它,但是我找不到在MariaDB的。

有誰知道任何解決方案?也許一些我不知道的模糊觸發器?請?

+0

「阻止人們閱讀隱藏數據」。如果他們可以直接訪問數據庫,他們可以閱讀完整的表格: - ? –

+1

你在做什麼是一個可怕的想法。與你的想法不同,你應該做的是使用'auto_increment',但是當你向用戶顯示數據時 - 加密id。這會阻止人們猜測實際價值是什麼。你在那裏做什麼會摧毀你的數據庫性能,這甚至不是最大的問題。 – Mjh

+0

@ÁlvaroGonzález他的意思是改變URL或任何其他入口點到另一個ID – FMashiro

回答

0
  • 想必您還有其他的方法來找到記錄?可能通過UNIQUE密鑰?如果是這樣,那麼在添加隨機ID後獲取該行。

  • 不要使用觸發器,而是編寫應用程序代碼。 (觸發器不能解決所有問題。)

+0

不,沒有可靠的方法使用UNIQUE字段來調用記錄。另外,我喜歡觸發器。它可以在服務器上自動運行,而不必擔心。 PHP代碼本質上效率較低。但沒有關係,我通過使用AUTO_INCREMENT和加密主鍵來解決問題。爲我的目的工作更好。 – theblackwidower