【发布时间】:2020-04-22 06:27:41
【问题描述】:
我正在修改我的程序,以允许用户在我的数据库中的一个表中为他们的记录定义一个习惯代码。因此,我在我的数据库中添加了一个新列,以保留用户定义的每个项目的“本地代码”,而不是项目的“通用代码”,它实际上是我表中记录的 ID .
所以,我想编写一个 SQL 查询,当它插入新记录时,如果“local_code”为空(我可以通过 PHP 确定这一点,但我也愿意接受 SQL 解决方案),它会插入“local_code”中项目的 ID。像这样的:
INSERT INTO items (`field_1`, `local_code`, `field_2`, ...)
VALUES ('blah blah blah', PREVIOUS_RECORD_ID + 1, 'blah blah blah', ...);
所以,基本上,我的问题是如何在没有并发问题的情况下找到 PREVIOUS_RECORD_ID。我不能在这里使用 LAST_INSERT_ID(),如果两个用户同时添加新记录,使用 SELECT max(id) FROM items 会导致并发问题。
如果有人能提出使用 MySQL 触发器的解决方案(例如在插入新记录后更新 local_code 的触发器,如果它为空),那也很好。
提前致谢。
示例:
假设我的数据库有三列:id、code、name
id | code | name
1 AAA blah blah blah1
2 BBB blah blah blah2
现在我想插入一条新记录。如果用户没有输入代码,我希望我的 SQL 查询执行此操作
INSERT INTO items (`code`, `name`)
VALUES (3, 'blah blah blah3', ...);
但是如果用户输入了“CCC”作为代码,它应该如下工作:
INSERT INTO items (`code`, `name`)
VALUES ("CCC", 'blah blah blah3', ...);
我可以确定代码是否为空,使用 PHP 来确定应该运行哪个 SQL 查询。所以,我真正的问题是代码为 NULL 的第一种情况。另外,如果有人有一个可以处理这两种情况的 SQL 解决方案,那就太棒了。
【问题讨论】:
-
请提供带有数据的示例示例,以便清楚地理解需求。
-
@SureshGajera 随意询问您认为不清楚的地方。我将编辑我的帖子并添加它。我的问题是如何在没有并发问题的情况下在 MySQL 中获取 PREVIOUS_RECORD_ID。
-
我无法理解 previous_record_id 示例数据会有所帮助。
-
@P.Salmon 我刚刚添加了一个我想做的例子。现在好点了吗?
-
我不明白你为什么要在代码下输入'3'
标签: php mysql sql triggers database-trigger