Primero, me disculpo si esto se ha preguntado antes, de hecho estoy seguro de que lo ha hecho, pero no puedo encontrarlo/no puedo resolver qué buscar para encontrarloCómo obtener la próxima identificación alfanumérica basada en el valor existente de MySQL
Necesito generar identificaciones de referencia rápida únicas, basadas en el nombre de una compañía. Así, por ejemplo:
Company Name Reference Smiths Joinery smit0001 Smith and Jones Consulting smit0002 Smithsons Carpets smit0003
Todos ellos se almacenan en una columna VARCHAR en una tabla de MySQL. Los datos serán recopilados, escapados e insertados como 'HTML -> PHP -> MySQL'. Los ID deben estar en el formato que se muestra arriba, cuatro letras, luego cuatro números (inicialmente al menos, cuando llego al smit9999
simplemente se derraman en 5 dígitos).
Puedo encargarme de generar las 4 letras del nombre de la empresa, simplemente voy a recorrer el nombre hasta que haya reunido 4 caracteres alfabéticos, y strtolower()
, pero luego necesito obtener el siguiente número disponible.
¿Cuál es la mejor/más fácil manera de hacer esto, por lo que se elimina la posibilidad de duplicados?
Por el momento estoy pensando:
$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);
pero puedo ver que esta causando un problema si dos usuarios intentan entrar en nombres de empresas que resultarían en el mismo ID al mismo tiempo. Utilizaré un índice único en la columna, por lo que no generará duplicados en la base de datos, pero aún así causará un problema.
¿Alguien puede pensar en una manera de hacer que MySQL me explique esto cuando hago la inserción, en lugar de calcularla en PHP de antemano?
Tenga en cuenta que el código real será OO y manejará los errores, etc. - Estoy buscando ideas sobre si hay una mejor manera de hacer esta tarea específica, se trata más de SQL que cualquier otra cosa.
EDITAR
creo que @ sugerencia de utilizar un disparador de MySQL de EmmanuelN puede ser la manera de manejar esto, pero:
- No soy lo suficientemente bueno con MySQL, en particular los factores desencadenantes, a hacer que esto funcione, y me gustaría un ejemplo paso a paso para crear, agregar y usar un disparador.
- Todavía no estoy seguro de si esto eliminará la posibilidad de que se generen dos identificaciones idénticas. Ver
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?
.
O estaría abierto a cualquier otro enfoque sugerido para este problema.
¿Ha pensado en usar el disparador y generar esa identificación dentro de un disparador? –
No, pero SQL es definitivamente mi tema más débil en términos de este tipo de proyecto, realmente no sé cómo usar activadores de manera efectiva. ¿Podría darme un resumen básico de cómo se haría esto? Si pudiera dirigirme hacia algún material de lectura relevante, estaría feliz :-) – DaveRandom
[Este artículo] (http://www.sugarcrm.com/forums/f6/developed-auto-generate-ids-guids -within-mysql-2895 /) habla sobre generación automática en GUIDs usando mysql, creo que le dará un lugar donde comenzar –