首页 > 解决方案 > mysql 在字段中重复值,插入具有新值的新行

问题描述

如果重复值输入到唯一字段中,我想在表中添加新记录。我不想更新现有记录,但想通过修改唯一字段值来添加新记录。这在mysql中可能吗?

标签: mysql

解决方案


编辑:

在用户对此帖子发表评论后编辑:

您需要 在这两个进程上写表锁定。

WRITE 锁具有以下特性:

  • 唯一持有表锁的会话可以从表中读取和写入数据。

  • 在释放 WRITE 锁之前,其他会话无法从表中读取数据和向表中写入数据。

另请查看SQL UNIQUE 约束

编辑前:

对的,这是可能的。我花了一段时间才弄清楚。我将它建立在您的输入和比较值上,如 test1、test2 等,其中 test 始终相同并且有尾随数字。正如你所指定的。

它可以通过 4 个步骤作为MySQL TRANSACTION完成。

假设您有testT一个名称是唯一的表,以确保我们没有双打。

| id  | name  |
| --- | ----- |
| 1   | test1 |
| 2   | test3 |

并且您要插入一个名为 test1 的新项目,我们设置为:

SET @newName = 'test1'; 

然后我们需要检查它是否已经存在于表中:

SELECT @check:=COUNT(*) FROM testT WHERE name = @newName;    

我们在这里进行计数以获得真或假并将其保存在@check这里以便我们稍后进行比较。这将导致表1 rowtest1已经存在。

接下来我们进行另一个选择以获取最大数量的 test* 并将其存储为@number,下一个查询选择所有测试并在 4 后者之后执行 SUBSTRING 给我们前 4 后者之后的所有数字。(99999999999) 数字实际上只是为了确保我们不会错过任何数字,但在我们的例子中,结果只有“3”,因为那是test3表中的最后一条记录“”。

SELECT 
    @number:= SUBSTRING(name,5,99999999999) 
FROM testT; 

现在我们可以做一个插入:

INSERT INTO testT(name)
VALUES
(
    IF(@check = "", @newName , CONCAT(LEFT(@newName,4),RIGHT(@number,1)+1)
)
);

这会尝试@newName在 IF 条件下将我们插入到表中,也就是说,如果我们 @check是空的,那么他将插入@newName,如果不是,它将从字符串中取出单词 test 并@number从前面添加一个最高值并添加 + 1。

所以结果@newName = 'test1'如下。如果将其更改为 @newName = 'test3'result 将是相同的新插入test4

**Schema (MySQL v5.7)**

    SET @newName = 'test1';   

---

**Query #1**

    SELECT * FROM testT
     ORDER BY id;

| id  | name  |
| --- | ----- |
| 1   | test1 |
| 2   | test3 |
| 3   | test4 |

---

如果您在任何测试中更改它*该数字不存在,它将正常插入。以下情况:@newName = 'test6'

SET @newName = 'test6';
    **Query #1**

        SELECT * FROM testT
         ORDER BY id;

    | id  | name  |
    | --- | ----- |
    | 1   | test1 |
    | 2   | test3 |
    | 3   | test6 |

这样一来,将始终进行插入。

您可以在这里玩这个:只需更改即可查看 DB FiddleSET @newName = 'test6'

我不是专家,我花了几个小时才弄清楚这条路,因为我想知道这是否可能。如果任何其他用户可以建议任何其他方式或改进我的方法,我将不胜感激。


推荐阅读