2017-06-21 18 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