sql >> Base de Datos >  >> RDS >> Mysql

mysql en valor duplicado en el campo, inserte una nueva fila con un nuevo valor

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.