2011-01-30 14 views
7

¿Hay alguna forma de acceder a la identificación del incremento automático para usar dentro de la consulta?accediendo a la ID de la inserción de mysql durante la inserción

por ejemplo Wordpress pone la identificación del inserto en el GUID de la misma fila, ¿hay alguna manera de que pueda acceder a la identificación que la fila tomará durante la inserción?

¿O tal vez hay alguna forma rápida para mí de saber cuál es el contador de IA actual, así que sé cuál será el que va a entrar?

Necesito esto porque estoy tratando de rellenar la tabla de publicaciones de WP en un nuevo tipo de publicación personalizada que estoy usando, y necesito tener el ID de la inserción para poner dentro de la columna de GUID.

+0

¿Puedes mostrar un ejemplo de código? –

+0

por ejemplo "Insertar en la tabla (id, nombre, dirección, auto_val) VALUES (NULL, 'John', '10 carriles sicómoro', 'MYSQL_AUTO_INCREMENT')" –

Respuesta

-3

acabé sacando el último ID de este modo:

$this->lID = mysql_fetch_assoc(mysql_query("SELECT ID FROM wp_posts ORDER BY ID DESC LIMIT 1")); 
     $this->lID = $this->lID[ID]; 
+0

Eso es malo. Otras conexiones podrían insertar filas entre su SELECT y su INSERT, a menos que BLOQUEE la tabla. – Alessandro

+0

Esto probablemente le causará problemas en el largo plazo como Alessandro indica – Jaydee

+0

Tiene usted razón, pero necesitaba esto para el que está de consulta para insertar datos antiguos en una nueva base de datos antes de que el sitio es en vivo, por lo que no hay problema. –

0

Supongo que quiere un tipo de columna con el mismo valor que el ID de usuario. ¿Pero por qué deberías hacer eso? solo use la ID de usuario, incluso si la usa, por ejemplo, como ID de referencia.

0

yo sepa, no se puede acceder al valor AUTO_INCREMENT de un registro que se inserta. Sugiero que inserte la fila, luego lea su ID y la actualice para llenar los campos para los que necesita saber la ID.

(¿Por qué necesita que parece su base de datos necesita un poco de normalización, si usted tiene un problema tan huevo de pollo?.)

0

Esta es una forma de hacerlo. Esto funcionó para mí:

1) simplemente ejecute 2 consultas MySql por separado. El primero inserta los valores de publicación en la tabla wp_posts. Debe insertar en todas las columnas, excepto en la columna "guid", insertar un marcador de posición, como "0".

2) la segunda consulta se ejecuta inmediatamente después de la primera y aquí puede llamar a la función LAST_INSERT_ID() para obtener la última ID de inserción de la consulta anterior. Esta segunda consulta actualiza el campo "guid" con el número de ID correcto.

Puede insertar esto en el bucle para la inserción masiva de mensajes WP del archivo csv, por ejemplo.

Debe hacer esto cuando el sitio esté fuera de línea o bloquear las tablas primero para que no surja ninguna otra solicitud de consulta entre las demás.

Ejemplo: primera consulta (lo siento por el formato de columna, pero es más fácil de depurar):

mysql_query("INSERT INTO wp_posts(
      ID, 
      post_author, 
      post_date, 
      post_date_gmt, 
      post_content, 
      post_title, 
      post_excerpt, 
      post_status, 
      comment_status, 
      ping_status, 
      post_password, 
      post_name, 
      to_ping, 
      pinged, 
      post_modified, 
      post_modified_gmt, 
      post_content_filtered, 
      post_parent, 
      guid, 
      menu_order, 
      post_type, 
      post_mime_type, 
      comment_count 
      ) VALUES (
      'null', 
      '1', 
      '$timestmp', 
      '$timestmp', 
      '$content', 
      '$posttitle', 
      '', 
      'publish', 
      'open', 
      'open', 
      '', 
      '$postname', 
      '', 
      '', 
      '$timestmp', 
      '$timestmp', 
      '', 
      '0', 
      '$uiai', 
      '0', 
      'post', 
      '', 
      '0' 
      )") or die(mysql_error()); 

segunda consulta:

$uid = mysql_insert_id(); 
$uiai = 'http://yoursite.net/wordpress/?post_type=post&p='.$uid; 
mysql_query("UPDATE wp_posts SET guid = '$uiai' WHERE ID = '$uid'"); 

... También, cuando se recorre muchas inserciones, a veces puede maximizar el tiempo máximo de ejecución permitido para el script PHP y la carga se interrumpe. Ayuda a usar set_time_limit (0); a lo largo de la secuencia de comandos por lo que el contador de tiempo máximo permitido se restablece periódicamente.

... espero que esto ayude :)

+0

¿Esto todavía funciona si alguien más inserta una fila antes de que se ejecute la segunda consulta? No quisiera actualizar accidentalmente la fila después de lo que pretendía. –

+0

..no, no debería. pero las posibilidades de que surja otra consulta cuando ambas partes de este script se ejecutan desde el mismo archivo son escasas. Sin embargo, en sistemas de alto tráfico, sugiero que esté fuera de línea para el momento de la actualización o si está utilizando inno DB, al menos enciérrelo. – Milan

+0

Lo necesitaba para un propósito diferente, aunque me di cuenta de que mi lógica de código era un poco paradójica y opté por un enfoque diferente (probablemente mejor). –

0

Tal vez usted podría utilizar AUTO_INCREMENT valor de su mesa en information_schema.tables en una consulta INSERT ... SELECT. En teoría INSERT ... SELECT debe bloquear information_schema.tables y AUTO_INCREMENT valor debe ser el Id que se usó para la siguiente INSERT. Pero difícilmente debería probar esto y considerar problemas de rendimiento.

Cuestiones relacionadas