Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql Bei doppeltem Wert im Feld neue Zeile mit neuem Wert einfügen

BEARBEITEN:

Bearbeitet nach Benutzerkommentar zu diesem Beitrag:

Sie benötigen Tabellensperre schreiben auf diesen beiden Prozessen.

Eine WRITE-Sperre hat die folgenden Eigenschaften:

  • Die einzige Sitzung, die die Sperre einer Tabelle hält, kann Daten aus der Tabelle lesen und schreiben.

  • Andere Sitzungen können keine Daten aus der Tabelle lesen und Daten in die Tabelle schreiben, bis die WRITE-Sperre aufgehoben wird.

Sehen Sie sich auch SQL UNIQUE Constraint an

VOR DER BEARBEITUNG:

Ja, es ist möglich. Und es dauerte eine Weile, bis ich es herausfand. Ich baue dies auf Ihren Eingabe- und Vergleichswerten als test1, test2 usw. auf, wobei test immer gleich ist und eine nachgestellte Nummer hat. Wie Sie angegeben haben.

Dies kann als MySQL TRANSACTION erfolgen in 4 Schritten.

Angenommen, Sie haben die Tabelle testT wobei der Name eindeutig ist, um sicherzustellen, dass wir keine Doubles haben.

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

Und Sie möchten ein neues Element mit dem Namen test1 einfügen, das wir wie folgt festlegen:

SET @newName = 'test1'; 

Dann müssen wir prüfen, ob es bereits in der Tabelle existiert:

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

Wir zählen hier, um wahr oder falsch zu werden, und speichern es als @check hier, damit wir es später vergleichen können. Dies ergibt 1 row als test1 existiert bereits in der Tabelle.

Als nächstes treffen wir eine weitere Auswahl, um die höchste Anzahl von Tests* zu erhalten, und speichern sie als @number , diese nächste Abfrage wählt alle Tests aus und führt nach 4 letzteren einen SUBSTRING aus, der uns alle Zahlen nach den ersten 4 letzteren gibt. (99999999999) Zahlen eigentlich nur, um sicherzugehen, dass wir keine verpassen, aber in unserem Fall ist das Ergebnis nur "3", weil das der letzte Datensatz "test3 ist " in der Tabelle.

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

Jetzt können wir eine Einfügung machen:

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

Dies versucht, unseren @newName einzufügen in die Tabelle unter IF-Bedingung, und das ist, wenn unser @check leer ist, fügt er @newName ein , wenn nicht, wird Worttest aus der Zeichenfolge genommen und eine höchste @number angehängt von früher und fügen Sie + 1 hinzu.

Ergebnis also für @newName = 'test1' ist unterhalb. Wenn Sie dies ändern in @newName = 'test3' Ergebnis wäre das gleiche neue Insert test4 .

**Schema (MySQL v5.7)**

    SET @newName = 'test1';   

---

**Query #1**

    SELECT * FROM testT
     ORDER BY id;

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

---

Und wenn Sie es in IRGENDEINEM Test* ändern, dass diese Nummer noch nicht existiert, wird sie normal eingefügt. Im Fall unten:@newName = 'test6'

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

        SELECT * FROM testT
         ORDER BY id;

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

Auf diese Weise wird immer eine Einlage gemacht.

Sie können hier damit spielen:View on DB Fiddle einfach durch Ändern von SET @newName = 'test6'

Ich bin kein Experte und ich habe ein paar Stunden gebraucht, um diesen Weg herauszufinden, da ich wissen wollte, ob dies überhaupt möglich ist. Und ich würde es begrüßen, wenn ein anderer Benutzer einen anderen Weg vorschlagen oder meine Methode verbessern könnte.