Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "Bases";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

Determine la primera identificación libre Encontrar ramas similares


S_King   (2001-12-04 10:18) [0]

Los asistentes ayudan a determinar el número libre 1-th en el procedimiento almacenado. Tenemos una tabla con un campo lleno (1,2,4,5 ...), es decir procedimiento debe emitir 3.



Vadim   (2001-12-04 10:51) [1]

Solo "torcido": busque por filas o con la ayuda de una tabla auxiliar. Tal vez usted puede configurar la tarea de manera diferente?



Владислав   (2001-12-04 10:57) [2]

Haga una selección ordenada en orden ascendente. Repase todos los registros (bueno, no todos, pero hasta que encuentre el número que necesita) encuentre lo que necesita y use.

Solo si desea obtener un número único, esta no es la mejor opción (o quizás la peor). Imagine lo que sucede si dos usuarios reciben simultáneamente ese número.



Yuvich   (2001-12-04 16:11) [3]

Si la tarea es así, entonces, para eliminar la situación descrita por Vladislav ("Imagine lo que sucede si dos usuarios obtienen simultáneamente ese número"), debe aplicar lo que ofrece Vadim ("usar la tabla auxiliar").

La mesa auxiliar mantiene una lista de "agujeros" en las habitaciones. Cuando se formó el agujero, se insertó en esta mesa; cómo llenar un hueco: lea el número mínimo de esta tabla y elimine este número de esta tabla. Todo se hace en activadores y al bloquear la "tabla de agujeros", por lo que dos usuarios nunca leerán el mismo número. Si se utiliza el método de cálculo, debe bloquear toda la "tabla de destino", y esto es malo para otros usuarios que simplemente pueden leer los datos.



S_King   (2001-12-04 16:43) [4]

Todo esto es comprensible, pero puede ser posible recorrerlo
1 a max (Id) almacenado procedimiento?

P / S: Lo siento, tal vez la pregunta está mal redactada.



Vadim   (2001-12-04 16:52) [5]

Es posible, pero hay un "pero": no se garantiza que dos usuarios al mismo tiempo no comenzarán a "girar el ciclo" y no tropezarán con el mismo "agujero" (personalmente califico esta probabilidad como muy alta). Si, por la condición del problema, esto es permisible, diríjase al camino, si no, vea más arriba.



dmitryK   (2001-12-04 17:12) [6]

Si usa un servidor SQL, entonces es lógico resolver tales problemas con una consulta SQL, es decir algo como esto

seleccione min (t1.ID) + 1
desde tabX t1 izquierda unirse a tabX t2 en t1.ID = t2.ID + 1
donde donde t2.ID es NULL

seguirá funcionando más rápido que la exageración del software. Y también puede implementar esto utilizando el diario de registros eliminados. Cuelga el gatillo para eliminar el registro (antes) y guarda todas las ID de los registros eliminados en una tabla separada. En este caso, al agregar nuevos registros, prácticamente no hay pérdida de tiempo para la búsqueda (es fundamental al agregar una gran cantidad de registros). Y para que dos usuarios no capturen la misma ID, usted busca y agrega el registro en una transacción.



S_King   (2001-12-05 09:55) [7]

Lo siento chicos, pero no pregunté por varios usuarios ...
¿Pero cómo hacer un bucle para una mesa?



dmitryK   (2001-12-05 10:49) [8]

Algo que ahora no entiendo, preguntaste cómo encontrar la identificación mínima gratuita. Te di una solicitud de cómo hacer esto. ¿Por qué, uno pregunta, necesita organizar un ciclo?



S_King   (2001-12-05 11:21) [9]

De alguna manera no entendí el texto de la consulta, ¿es posible crearlo para la misma tabla?



dmitryK   (2001-12-05 12:33) [10]

seleccione min (t1.ID) + 1
desde tabX t1 izquierda unirse a tabX t2 en t1.ID = t2.ID + 1
donde donde t2.ID es NULL

tabX: esta es tu mesa. Ella se une consigo misma. Como resultado, obtiene una solicitud que incluye dos columnas con ID
la primera es todas las ID en tu tabla,
el segundo - si ID + 1 es, entonces su valor, si no, entonces NULL

donde donde t2.ID es NULL: deja solo aquellos donde la segunda columna es NULL, es decir ID + 1 es gratis.

min (t1.ID) + 1: devuelve el número de identificación libre mínimo.

Lea la descripción del lenguaje SQL con más detalle.

Dicha solicitud solo tiene un inconveniente, debe haber al menos un registro en la tabla y el número de identificación gratuito siempre será mayor que el mínimo ocupado.
Pero esa es otra historia ...



S_King   (2001-12-05 16:32) [11]

No sé por qué, pero tengo esta solicitud que cuelga la base hasta la muerte.
juzgado en consol, experto



Páginas: 1 rama entera

Foro: "Bases";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba





Memoria: 0.58 MB
Tiempo: 0.04 c
1-22101
DenKop
2001-12-18 14:38
2002.01.08
Creando ayuda s


4-22472
Eugene
2001-10-27 17:03
2002.01.08
¿Cómo hacer tu pequeño servidor proxy?


3-21973
Zav
2001-12-06 10:55
2002.01.08
Componente DBNavigator


3-21910
Wladimir
2001-12-04 08:01
2002.01.08
¿Número de entradas en la tabla?


14-22394
Vitaly
2001-11-09 19:51
2002.01.08
MENTA dia mañana ....





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish French
gallego georgiano Alemán Griego criollo haitiano Hebreo hindi Húngaro islandés Indonesian irlandés Italiano Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese Rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español