如果字段的值为空,则在 MySQL 中插入新记录,同时在不同的字段中添加 ID+1

Posted

技术标签:

【中文标题】如果字段的值为空,则在 MySQL 中插入新记录,同时在不同的字段中添加 ID+1【英文标题】:Insert a new record in MySQL while adding ID+1 in a different field if the value of the field is null 【发布时间】: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' 【参考方案1】:

据我了解:

    我们关心两列,我将它们命名为universal_code和local_code universal_code 是一个 auto_increment,始终为 previous_insert + 1 用户何时提交数据

universal_code = auto_increment if local_code is not null local_code = submitted local_code value else local_code should be same as universal_code

我会做什么:

使用两个查询进行此操作以避免并发问题。插入然后更新

    插入带有空白 local_code 的行并返回新插入的 Universal_code 检查本地代码。如果 local_code 为 null,则使用 Universal_code 更新行,否则使用提交的 local_code 值更新行

【讨论】:

是的。您对我想做的事情是正确的(+1),但我不明白这是如何避免并发问题的。事实上我已经考虑过你的解决方案,但想象一下:我添加了一条新记录,假设 id=3,其他人同时插入另一条记录,即 id=4,然后当我运行更新时,它在与关联的记录中插入 4 ID = 3,这是不好的。我正在运行两个查询。我更喜欢只在可能的情况下进行一次查询。 关键是您将始终对插入查询将返回的 id 运行更新。因此,如果您添加一条 id=3 的记录,您的插入将返回 id 3。那么您的更新将是 update table set local_code = 3 where universal_code = 3。您不会担心/与 id=4 发生冲突 这是怎么回事?我的问题的重点是正确获取 ID。我不能使用 LAST_INSERT_ID() 因为我没有在我的设计中为每个查询使用一个连接。如何获取插入查询返回的 id?请写SQL代码。这就是我迷路的地方。 如果您仍然关心并发性,请查看此答案。 link

以上是关于如果字段的值为空,则在 MySQL 中插入新记录,同时在不同的字段中添加 ID+1的主要内容,如果未能解决你的问题,请参考以下文章

如果值为空,则在 SQL 中生成一个新列,该列显示前一个单元格中的值

php+mysql多字段同时修改,如果传来的值为空则不修改,php该用哪种方法最好?

插入mysql数据库,sql语句没错,每个字段都有值,但到插入到数据库后值为空。为啥?

MySQL 如果目标字段为空,则在字段之间复制一个字符串

Mysql如果某个字段值存在则更新另一个字段的值为原值+100,命令应该如何写?

sql如何判断字段的值是否空值