如果字段值为空,则在 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

我正在修改我的程序,以允许用户在我的 table 之一的数据库中为他们的记录定义一个习惯代码。因此,我在数据库中添加了一个新列,以保留用户定义的每个项目的 "local code",而不是项目的 "universal code",后者实际上是记录的 ID我的 table.

所以,我想写一个 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 解决方案来处理这两种情况,那就太棒了。

据我了解:

  1. 我们关注 2 列,我将它们命名为 universal_code 和 local_code
  2. universal_code 是一个 auto_increment 并且永远是 previous_insert + 1
  3. 用户何时提交数据

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

我会做什么:

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

  1. 插入空白行 local_code 和 return 新插入 universal_code
  2. 检查 local_code。如果 local_code 为空,则使用 universal_code 更新行,否则使用提交的 local_code 值
  3. 更新行