EDIT:
Diedit setelah pengguna mengomentari posting ini:
Anda memerlukan menulis penguncian tabel pada kedua proses tersebut.
Kunci MENULIS memiliki beberapa fitur berikut:
-
Satu-satunya sesi yang memegang kunci tabel dapat membaca dan menulis data dari tabel.
-
Sesi lain tidak dapat membaca data dari dan menulis data ke tabel sampai kunci MENULIS dilepaskan.
Lihat juga Kendala SQL UNIK
SEBELUM MENGEDIT:
Ya itu mungkin. Dan saya butuh beberapa saat untuk mengetahuinya. Saya membangun ini pada input Anda dan nilai-nilai yang dibandingkan sebagai test1, test2 dll, di mana test selalu sama dan memiliki nomor tambahan. Seperti yang Anda tentukan.
Itu dapat dilakukan sebagai TRANSAKSI MySQL dalam 4 langkah.
Katakanlah Anda memiliki tabel testT
di mana nama unik untuk memastikan kami tidak memiliki ganda.
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
Dan Anda ingin memasukkan item baru dengan nama test1 yang kami tetapkan adalah sebagai:
SET @newName = 'test1';
Kemudian kita perlu memeriksa apakah sudah ada di tabel:
SELECT @check:=COUNT(*) FROM testT WHERE name = @newName;
Kami menghitung di sini untuk mendapatkan benar atau salah dan menyimpannya sebagai @check
di sini sehingga kita dapat membandingkannya nanti. Ini akan menghasilkan 1 row
sebagai test1
sudah ada di tabel.
Selanjutnya kita melakukan seleksi lagi untuk mendapatkan jumlah test* tertinggi dan menyimpannya sebagai @number
, kueri berikutnya ini memilih semua tes dan melakukan SUBSTRING setelah 4 yang terakhir memberi kita semua angka setelah 4 yang terakhir. (999999999999) angka sebenarnya hanya untuk memastikan kami tidak ketinggalan tetapi dalam kasus kami hasilnya hanya "3" karena itu adalah catatan terakhir "test3
" dalam tabel.
SELECT
@number:= SUBSTRING(name,5,99999999999)
FROM testT;
Sekarang kita dapat melakukan penyisipan:
INSERT INTO testT(name)
VALUES
(
IF(@check = "", @newName , CONCAT(LEFT(@newName,4),RIGHT(@number,1)+1)
)
);
Ini mencoba memasukkan @newName
. kami ke dalam tabel dalam kondisi JIKA, dan itu adalah jika @check
our kami kosong maka dia akan memasukkan @newName
, jika tidak, itu akan mengeluarkan tes kata dari string dan menambahkan @number
tertinggi highest dari sebelumnya dan tambahkan +1 juga.
Jadi hasil untuk @newName = 'test1'
ada di bawah. Jika Anda mengubah ini menjadi @newName = 'test3'
hasilnya akan sama baru masukkan test4
.
**Schema (MySQL v5.7)**
SET @newName = 'test1';
---
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test4 |
---
Dan jika Anda mengubahnya dalam tes APAPUN* nomor itu belum ada, ia akan memasukkannya secara normal. Dalam kasus di bawah ini:@newName = 'test6'
SET @newName = 'test6';
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test6 |
Dengan cara ini sisipan akan selalu dibuat.
Anda dapat memainkannya di sini :Lihat di DB Fiddle
hanya dengan mengubah SET @newName = 'test6'
Saya bukan ahli dan butuh beberapa jam untuk mencari jalan keluar ini, karena saya ingin tahu apakah ini mungkin. Dan saya akan sangat menghargai jika ada pengguna lain yang dapat menyarankan cara lain atau meningkatkan metode saya.