2009-10-28 17 views
7

Estoy intentando alguna algo así:MySQL: utilizar el identificador de la fila que se inserta en la instrucción de inserción en sí

INSERT INTO dir_pictures SET filename=CONCAT(picture_id,'-test'); 

picture_id es mi clave primaria, incremento automático. Básicamente estoy tratando de poner el id de esta declaración insertada, en la declaración misma.

Estoy seguro de que se puede hacer con un código PHP adicional o usando más de una afirmación, pero me preguntaba si existe una manera rápida y fácil de hacerlo en una sola toma.

PS. La declaración anterior siempre pone '0-test'

Respuesta

10

Primero inserte un registro. A continuación, separe sus declaraciones con un punto y coma y use LAST_INSERT_ID() para recuperar la identificación de autoincrement recién insertada. Ejecutar de una vez.

 
insert into dir_pictures .... ; 
update dir_pictures set filename=CONCAT(LAST_INSERT_ID(),'-test') where id = LAST_INSERT_ID() 
+0

Esto podría causar una condición de carrera ... cuidado –

+7

¿Cómo podría ser? last_insert_id() se supone que es específico de la conexión. Para citar el manual: 'Usar las columnas LAST_INSERT_ID() y AUTO_INCREMENT simultáneamente desde múltiples clientes es perfectamente válido. Cada cliente recibirá la última identificación insertada para la última declaración ejecutada por el cliente. – ChristopheD

+1

es suficiente. mi error –

0

Bueno, no te dan a conocer el ID de fila hasta que el inserto ha completado ... así, no creo que nunca va a trabajar!

¿Por qué no simplemente calcula el nombre del archivo cuando recupera la fila?

INSERT INTO dir_pictures (file_extension) VALUES ('-data') 

SELECT picture_id, CONCAT(picture_id, file_extension) as filename 
FROM dir_pictures 
0

Esto no es realmente posible, probablemente sería en su mejor interés para simplemente contatenar en el camino de salida en lugar de la forma de entrar.

SELECT CONCAT (id, '-text') como nombre de archivo dir_pictures

0

Si realmente desea hacerlo en una sentencia SQL, usted podría intentar un truco como:

INSERT INTO dir_pictures SET filename=CONCAT((select max(picture_id)+1 from dir_pictures),'-test');

Cuidado con las condiciones de carrera si se trata de una aplicación multi-hilo ...

Además, dudo que sería trabajar en una mesa vacía ...

+0

Creo que si una fila se ha eliminado antes, esto no será preciso –

+0

Sí, gracias, buena captura. Si se eliminó la fila _más recientemente_ añadida, esto fallaría. – violoncello

3

sólo tiene que seleccionar el valor actual para el AUTO_INCREMENT table form the information_schema como parte de su inserción:

INSERT INTO dir_pictures SET filename=CONCAT((SELECT auto_increment FROM 
information_schema.tables WHERE table_name='dir_pictures'), '-test') 
+0

Sí, esta sería la manera de hacerlo en una declaración ... pero realmente no es una buena idea. Definitivamente haré un inserto, luego actualizaré. – Eli

+0

Es feo y hay una pequeña condición de carrera entre cuando se completa la selección interna y se ejecuta la inserción. – Eli

Cuestiones relacionadas