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 row
中test1
已经存在。
接下来我们进行另一个选择以获取最大数量的 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'
我不是专家,我花了几个小时才弄清楚这条路,因为我想知道这是否可能。如果任何其他用户可以建议任何其他方式或改进我的方法,我将不胜感激。
推荐阅读
- windows - 如何从桌面上删除除 .Ink 快捷方式以外的所有文件?(视窗 10)
- javascript - 将图像添加到使用 jsPDF 创建的 pdf,然后使用 jsZIP 压缩 pdf
- r - 带有可点击链接的 tmap 传单上的弹出窗口
- r - 使用 3d 加速度计算动物滚动的正确方法?
- reactjs - 标记图标未显示在传单中
- c# - 如何更改从 monthCalendar 输出的日期格式
- ruby-on-rails - 如何扩展 ActiveSupport::TaggedLogging 以输出 json 行
- powershell - 如何检索正确的子网资源 ID 以创建虚拟网络规则?
- macos - Visual Studio Code (VSCode) 如何知道 ~/.config/fish/config.fish 中设置的环境变量?
- python-3.x - 如何从函数中获取值,并在另一个函数中使用它?