Trước tiên, tôi xin lỗi nếu điều này đã được hỏi trước đó - thực sự tôi chắc chắn nó có, nhưng tôi không thể tìm thấy nó/không thể tìm ra để tìm kiếm nó.Cách nhận ID alpha-số tiếp theo dựa trên giá trị hiện tại từ MySQL
Tôi cần tạo id tham chiếu nhanh duy nhất, dựa trên tên công ty. Ví dụ:
Company Name Reference Smiths Joinery smit0001 Smith and Jones Consulting smit0002 Smithsons Carpets smit0003
Tất cả sẽ được lưu trữ trong cột varchar trong bảng MySQL. Dữ liệu sẽ được thu thập, thoát và chèn như 'HTML -> PHP -> MySQL'. ID phải ở định dạng được mô tả ở trên, bốn chữ cái, sau đó là bốn chữ số (ban đầu ít nhất - khi tôi đạt đến smit9999
nó sẽ chỉ tràn qua thành 5 chữ số).
Tôi có thể xử lý việc tạo ra 4 chữ cái từ tên công ty, tôi sẽ chỉ cần bước qua tên cho đến khi tôi đã thu thập 4 ký tự alpha và strtolower()
- nhưng sau đó tôi cần có số tiếp theo.
Cách tốt nhất/dễ nhất để thực hiện việc này là gì, để khả năng loại bỏ trùng lặp?
Tại thời điểm tôi đang nghĩ:
$fourLetters = 'smit';
$query = "SELECT `company_ref`
FROM `companies`
WHERE
`company_ref` LIKE '$fourLetters%'
ORDER BY `company_ref` DESC
LIMIT 1";
$last = mysqli_fetch_assoc(mysqli_query($link, $query));
$newNum = ((int) ltrim(substr($last['company_ref'],4),'0')) + 1;
$newRef = $fourLetters.str_pad($newNum, 4, '0', STR_PAD_LEFT);
Nhưng tôi có thể thấy điều này gây ra một vấn đề nếu hai người dùng cố gắng nhập tên công ty mà sẽ cho kết quả trong cùng một ID cùng một lúc. Tôi sẽ sử dụng một chỉ mục duy nhất trên cột, vì vậy nó sẽ không dẫn đến trùng lặp trong cơ sở dữ liệu, nhưng nó vẫn sẽ gây ra một vấn đề.
Bất cứ ai có thể nghĩ ra một cách để MySQL làm việc này cho tôi khi tôi chèn, thay vì tính toán nó trong PHP trước? Lưu ý rằng mã thực tế sẽ là OO và sẽ xử lý lỗi vv - Tôi chỉ đang tìm kiếm những suy nghĩ về việc liệu có cách nào tốt hơn để thực hiện tác vụ cụ thể này hay không, nó còn nhiều hơn về SQL so với bất kỳ thứ gì khác.
EDIT
Tôi nghĩ rằng @ đề nghị sử dụng một kích hoạt MySQL EmmanuelN của có thể là cách để xử lý này, nhưng:
- Tôi không đủ tốt với MySQL, đặc biệt là gây nên, để có được điều này để làm việc, và muốn một ví dụ từng bước tạo, thêm và sử dụng một kích hoạt.
- Tôi vẫn không chắc liệu điều này sẽ loại bỏ khả năng tạo ra hai ID giống hệt nhau hay không. Xem
what happens if two rows are inserted at the same time that result in the trigger running simultaneously, and produce the same reference? Is there any way to lock the trigger (or a UDF) in such a way that it can only have one concurrent instance?
.
Hoặc tôi sẽ mở cho bất kỳ phương pháp tiếp cận được đề xuất nào khác cho vấn đề này.
Bạn có nghĩ về việc sử dụng trình kích hoạt và tạo id đó bên trong trình kích hoạt không? –
Không, nhưng SQL chắc chắn là đối tượng yếu nhất của tôi về loại dự án này, tôi thực sự không biết cách sử dụng các trình kích hoạt một cách hiệu quả - bạn có thể cho tôi chạy cơ bản về cách thực hiện điều này không? Nếu bạn có thể chỉ cho tôi theo hướng của một số tài liệu đọc có liên quan tôi sẽ được hạnh phúc :-) – DaveRandom
[Bài viết này] (http://www.sugarcrm.com/forums/f6/developed-auto-generate-ids-guids -within-mysql-2895 /) nói về việc tạo tự động trên GUIDs bằng cách sử dụng mysql, tôi nghĩ nó sẽ cung cấp cho bạn một nơi nào đó để bắt đầu –