Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

mysql Pada nilai Duplikat di bidang, masukkan baris baru dengan nilai baru

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengatur ulang kata berhenti di MYSQL?

  2. Bagaimana cara memperbaiki server wamp tanpa menginstal ulang?

  3. bagaimana cara menggunakan suka dengan bergabung di sql?

  4. Spring Boot MySql Access ditolak untuk pengguna 'root'@'localhost'

  5. Apa arti angka dalam kurung sebenarnya?