Php 如何获取MariaDB/MySQL中插入行的随机生成的主键?

Php 如何获取MariaDB/MySQL中插入行的随机生成的主键?,php,mysql,pdo,mariadb,Php,Mysql,Pdo,Mariadb,好的,我目前正在开发一个网站,应该有一个泳池水泵的可搜索数据库。作为这个系统的一部分,为了防止人们阅读隐藏的数据,我随机生成了池泵股票的主键。以下是我为MariaDB后端编写的代码: DELIMITER $$ CREATE TRIGGER random_pump_id BEFORE INSERT ON tbl_stock FOR EACH ROW BEGIN DECLARE temp_id MEDIUMINT; REPEAT SET temp_id = FLOOR

好的,我目前正在开发一个网站,应该有一个泳池水泵的可搜索数据库。作为这个系统的一部分,为了防止人们阅读隐藏的数据,我随机生成了池泵股票的主键。以下是我为MariaDB后端编写的代码:

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,我可以使用LAST_INSERT_ID函数,或者PDO中的LAST insertid。但由于我没有使用自动递增,而是使用一个单独的触发器,这些函数将只返回0。我知道我可以在PostgreSQL中使用RETURNING子句来实现这一点,但在MariaDB中找不到实现这一点的方法

有人知道有什么解决办法吗?也许是某个我不知道的隐晦的触发器?求你了

想必你还有别的办法找到记录?可能是通过一个唯一的钥匙?如果是,则在添加随机id后提取行

不要使用触发器,而是编写应用程序代码。触发器不能解决所有问题


防止人们读取隐藏的数据。如果他们可以直接访问数据库,他们仍然可以读取完整的表:-?你所做的是一个糟糕的想法。你应该做的不是你的想法,而是使用自动增量,但是当你向用户显示数据时,加密id。这将防止人们猜测实际价值是什么。你在那里所做的将使你的数据库性能一败涂地,而这甚至不是最大的问题。@阿尔瓦罗冈萨雷斯他的意思是将URL或任何其他入口点更改为另一个ID@Mjh我不明白你说的“加密id”是什么意思。身份证是什么?ID究竟拥有哪些我应该加密的内容。除非你的意思是“加密ID”,但我也不知道你的意思。除非您指的是散列,但这仅适用于显示id。当我尝试使用此“加密id”调用记录时,除非您解决了PvNP,否则这是不可能的。我的意思是,当您在URL或任何类型的UI中向最终用户显示auto_increment时,加密auto_increment的值。当您收到返回的值时,对其进行解密并按预期使用数据库。不要混淆或随机化主键,这不是一个好主意。您所追求的是禁止人们使用序列号通过爬虫程序或类似程序获取数据-您最好的方法是在向公众显示此敏感主键信息之前对其进行加密。这就是我的意思。请不要随机化主键,尤其是这样。不,没有可靠的方法使用唯一字段调用记录。还有,我喜欢扳机。它在服务器上自动运行,而无需我费心。PHP代码本质上效率较低。但这一切都无关紧要,我通过使用自动递增和加密主键解决了这个问题。对我来说效果更好。