Si necesita un campo de autoincrement de clave no primaria, una muy buena solución de MySQL para crear secuencias de arbitraty es utilizar la función relativamente desconocida last_insert_id(expr)
.
Si expr se da como un argumento para LAST_INSERT_ID(), el valor del argumento es devuelto por la función y es recordado como el siguiente valor para ser devuelto por LAST_INSERT_ID(). Este puede ser utilizado para simular secuencias ...
(de http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id)
Aquí es un ejemplo que muestra cómo una secuencia secundaria se puede mantener para la numeración de los comentarios para cada mensaje:
CREATE TABLE `post` (
`id` INT(10) UNSIGNED NOT NULL,
`title` VARCHAR(100) NOT NULL,
`comment_sequence` INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
CREATE TABLE `comment` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`post_id` INT(10) UNSIGNED NOT NULL,
`sequence` INT(10) UNSIGNED NOT NULL,
`content` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO post(id, title) VALUES(1, 'first post');
INSERT INTO post(id, title) VALUES(2, 'second post');
UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=1;
INSERT INTO `comment`(post_id, sequence, content) VALUES(1, Last_insert_id(), 'blah');
UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=1;
INSERT INTO `comment`(post_id, sequence, content) VALUES(1, Last_insert_id(), 'foo');
UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=1;
INSERT INTO `comment`(post_id, sequence, content) VALUES(1, Last_insert_id(), 'bar');
UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=2;
INSERT INTO `comment`(post_id, sequence, content) VALUES(2, Last_insert_id(), 'lorem');
UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=2;
INSERT INTO `comment`(post_id, sequence, content) VALUES(2, Last_insert_id(), 'ipsum');
SELECT * FROM post;
SELECT * FROM comment;
Sugeriría reescribir el título para algo que sea un poco más claro como "Crear campos de autoincrementación independientes de la base de datos". Mi preocupación es que no creo que encontraría su título cuando buscaría el mismo tema. – Elijah
¿Realmente necesita un número que se incrementa continuamente, o simplemente necesita exclusividad? –
Sí Necesito "un número de incremento continuo", para otras situaciones uso guids, CRC, etc. ... –