EDITAR:
Editado después del comentario del usuario en esta publicación:
Necesita bloqueo de tabla de escritura en ambos procesos.
Un bloqueo de ESCRITURA tiene las siguientes características:
-
La única sesión que mantiene el bloqueo de una tabla puede leer y escribir datos de la tabla.
-
Otras sesiones no pueden leer ni escribir datos en la tabla hasta que se libere el bloqueo de ESCRITURA.
Consulte también Restricción ÚNICA de SQL
ANTES DE EDITAR:
Sí, es posible. Y me tomó un tiempo darme cuenta. Construyo esto en su entrada y valores de comparación como prueba1, prueba2, etc., donde la prueba es siempre la misma y tiene un número final. Como usted especificó.
Se puede hacer como Transacción MySQL en 4 pasos.
Digamos que tiene la tabla testT
donde el nombre es único para asegurar que no tengamos dobles.
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
Y desea insertar un nuevo elemento con el nombre test1 que configuramos como:
SET @newName = 'test1';
Luego, debemos verificar si ya existe en la tabla:
SELECT @check:=COUNT(*) FROM testT WHERE name = @newName;
Hacemos un conteo aquí para obtener verdadero o falso y lo guardamos como @check
aquí para que podamos compararlo más tarde. Esto resultará en 1 row
como test1
ya existe en la tabla.
A continuación, hacemos otra selección para obtener el mayor número de pruebas* y lo almacenamos como @number
, esta siguiente consulta selecciona todas las pruebas y realiza una SUBCADENA después de las 4 últimas, dándonos todos los números después de las primeras 4 últimas. (99999999999) números en realidad solo para asegurarnos de que no nos perdamos ninguno, pero en nuestro caso el resultado es solo "3" porque ese es el último registro "test3
" en la tabla.
SELECT
@number:= SUBSTRING(name,5,99999999999)
FROM testT;
Ahora podemos hacer una inserción:
INSERT INTO testT(name)
VALUES
(
IF(@check = "", @newName , CONCAT(LEFT(@newName,4),RIGHT(@number,1)+1)
)
);
Esto intenta insertar nuestro @newName
en la tabla bajo la condición IF, y eso es si nuestro @check
está vacío, entonces insertará @newName
, si no, tomará la prueba de palabras de la cadena y agregará un @number
más alto de antes y agregue + 1 también.
Entonces resultado para @newName = 'test1'
Esta abajo. Si cambia esto a @newName = 'test3'
el resultado sería el mismo inserto nuevo test4
.
**Schema (MySQL v5.7)**
SET @newName = 'test1';
---
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test4 |
---
Y si lo cambia en CUALQUIER prueba*, ese número aún no existe, lo insertará normalmente. En el caso siguiente:@newName = 'test6'
SET @newName = 'test6';
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test6 |
De esta manera siempre se hará una inserción.
Puedes jugar con esto aquí:Ver en DB Fiddle
simplemente cambiando SET @newName = 'test6'
No soy un experto y me tomó un par de horas encontrar esta manera, ya que quería saber si esto era posible. Y agradecería si algún otro usuario puede sugerir otra forma o mejorar mi método.