Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql Trên Giá trị trùng lặp trong trường, chèn hàng mới với giá trị mới

CHỈNH SỬA:

Đã chỉnh sửa sau khi người dùng bình luận về bài đăng này:

Bạn cần khóa bảng trên cả hai quy trình đó.

Khóa WRITE có các tính năng sau:

  • Phiên duy nhất giữ khóa của bảng có thể đọc và ghi dữ liệu từ bảng.

  • Các phiên khác không thể đọc dữ liệu từ và ghi dữ liệu vào bảng cho đến khi khóa WRITE được giải phóng.

Ngoài ra, hãy xem Ràng buộc DUY NHẤT của SQL

TRƯỚC KHI CHỈNH SỬA:

Có nó là có thể. Và tôi đã mất một lúc để tìm ra nó. Tôi xây dựng điều này dựa trên các giá trị đầu vào và tính toán của bạn dưới dạng test1, test2, v.v., trong đó kiểm tra luôn giống nhau và có số theo sau. Như bạn đã chỉ định.

Nó có thể được thực hiện dưới dạng GIAO DỊCH MySQL trong 4 bước.

Giả sử bạn có bảng testT nơi mà tên là duy nhất để đảm bảo rằng chúng tôi không có nhân đôi.

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

Và bạn muốn chèn một mục mới với tên test1 mà chúng tôi đặt là:

SET @newName = 'test1'; 

Sau đó, chúng ta cần kiểm tra xem nó đã tồn tại trong bảng chưa:

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

Chúng tôi đếm ở đây để biết đúng hay sai và lưu nó dưới dạng @check ở đây để chúng ta có thể so sánh nó sau này. Điều này sẽ dẫn đến 1 row dưới dạng test1 đã tồn tại trong bảng.

Tiếp theo, chúng tôi thực hiện một lựa chọn khác để có được số lượng thử nghiệm cao nhất * và lưu trữ dưới dạng @number , truy vấn tiếp theo này chọn tất cả các bài kiểm tra và thực hiện SUBSTRING sau 4 bài kiểm tra sau cho chúng ta tất cả các số sau 4 bài kiểm tra đầu tiên. (99999999999) số thực ra chỉ để đảm bảo chúng tôi không bỏ sót bất kỳ số nào nhưng trong trường hợp của chúng tôi, kết quả chỉ là "3" vì đó là bản ghi cuối cùng "test3 "trong bảng.

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

Bây giờ chúng ta có thể thực hiện chèn:

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

Điều này cố gắng chèn @newName của chúng tôi vào bảng trong điều kiện IF và đó là nếu @check của chúng tôi trống thì anh ta sẽ chèn @newName , nếu không, nó sẽ kiểm tra từ ra khỏi chuỗi và thêm @number cao nhất từ trước đó và thêm + 1 nữa nó.

Vì vậy, kết quả cho @newName = 'test1' là bên dưới. Nếu bạn thay đổi điều này thành @newName = 'test3' kết quả sẽ giống như chèn mới test4 .

**Schema (MySQL v5.7)**

    SET @newName = 'test1';   

---

**Query #1**

    SELECT * FROM testT
     ORDER BY id;

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

---

Và nếu bạn thay đổi nó trong BẤT KỲ bài kiểm tra nào * mà số đó chưa tồn tại thì nó sẽ chèn nó bình thường. Trong trường hợp bên dưới:@newName = 'test6'

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

        SELECT * FROM testT
         ORDER BY id;

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

Bằng cách này, một phụ trang sẽ luôn được thực hiện.

Bạn có thể chơi với cái này tại đây: Xem trên DB Fiddle chỉ bằng cách thay đổi SET @newName = 'test6'

Tôi không phải là chuyên gia và tôi đã mất vài giờ để tìm ra cách này, vì tôi muốn biết liệu điều này có khả thi hay không. Và tôi sẽ đánh giá cao nếu bất kỳ người dùng nào khác có thể đề xuất bất kỳ cách nào khác hoặc cải thiện phương pháp của tôi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật bảng từ một bảng khác và cơ sở dữ liệu khác

  2. MySQL + PHP:tìm nạp dữ liệu bằng khóa ngoại

  3. php mysql lưu trữ ngắt dòng trong vùng văn bản trong cơ sở dữ liệu

  4. Đóng kết nối MySQL (PHP)

  5. Khóa ngoại trong vấn đề di chuyển Laravel 4