2012-01-06 11 views
46

He creado una tabla con una clave principal y habilitado AUTO_INCREMENT, ¿cómo obtengo el uso de MYSQL AUTO_INCREMENT?¿Cómo insertar datos en MySQL con la clave primaria incrementada automáticamente?

CREATE TABLE IF NOT EXISTS test.authors (
    hostcheck_id INT PRIMARY KEY AUTO_INCREMENT, 
    instance_id INT, 
    host_object_id INT, 
    check_type INT, 
    is_raw_check INT, 
    current_check_attempt INT, 
    max_check_attempts INT, 
    state INT, 
    state_type INT, 
    start_time datetime, 
    start_time_usec INT, 
    end_time datetime, 
    end_time_usec INT, 
    command_object_id INT, 
    command_args VARCHAR(25), 
    command_line VARCHAR(100), 
    timeout int, 
    early_timeout INT, 
    execution_time DEC(18,5), 
    latency DEC(18,3), 
    return_code INT, 
    output VARCHAR(50), 
    long_output VARCHAR(50), 
    perfdata VARCHAR(50) 
); 

Ésta es la consulta que usé, lo he intentado "" y "1" para el primer valor, pero no funciona.

INSERT INTO test.authors VALUES ('1','1','67','0','0','1','10','0','1', 
'2012-01-03 12:50:49','108929','2012-01-03 12:50:59','198963','21','', 
'/usr/local/nagios/libexec/check_ping 5','30','0','4.04159','0.102','1', 
'PING WARNING -DUPLICATES FOUND! Packet loss = 0%, RTA = 2.86 ms','', 
'rta=2.860000m=0%;80;100;0'); 

Respuesta

42

Con el fin de tomar ventaja de la capacidad de incremento automático de la columna, no proporcionar un valor para esa columna al insertar filas. La base de datos le proporcionará un valor.

INSERT INTO test.authors (
    instance_id,host_object_id,check_type,is_raw_check, 
    current_check_attempt,max_check_attempts,state,state_type, 
    start_time,start_time_usec,end_time,end_time_usec,command_object_id, 
    command_args,command_line,timeout,early_timeout,execution_time, 
    latency,return_code,output,long_output,perfdata 
) VALUES (
    '1','67','0','0','1','10','0','1','2012-01-03 12:50:49','108929', 
    '2012-01-03 12:50:59','198963','21','', 
    '/usr/local/nagios/libexec/check_ping 5','30','0','4.04159', 
    '0.102','1','PING WARNING -DUPLICATES FOUND! Packet loss = 0%, RTA = 2.86 ms', 
    '','rta=2.860000m=0%;80;100;0' 
); 
+76

O simplemente pasar NULL –

+0

pero la consulta que ha pegado para mí que poner en valor para la clave primaria? –

+2

@SalmanRaza: no, mira: la columna "hostcheck_id" falta en la consulta que sugerí. Di valores para solo 23 columnas pero hay 24 columnas en la tabla. ¡Creo que la sugerencia de Adrian también funcionaría, pero no sabía que pudieras hacer eso! – Celada

86

Configure el campo de incremento automático a NULL o 0 si usted quiere que sea automático mágicamente asignado ...

+2

+1 Esta es la solución más simple. – CodeBlue

+0

Esto funciona para mí a diferencia de saltarse el valor de columna de autoincremento. – ASten

+0

Esta debería ser la respuesta aceptada. –

5

Salida this posterior

Según se

n el valor se especificó para la columna AUTO_INCREMENT, por lo que MySQL asignó números de secuencia automáticamente. También puede explícitamente asignar NULL o 0 a la columna para generar números de secuencia.

6

default La palabra clave funciona para mí:

mysql> insert into user_table (user_id, ip, partial_ip, source, user_edit_date, username) values 
(default, '39.48.49.126', null, 'user signup page', now(), 'newUser'); 
--- 
Query OK, 1 row affected (0.00 sec) 

estoy corriendo mysql --version 05/01/66:

mysql Ver 14.14 Distrib **5.1.66**, for debian-linux-gnu (x86_64) using readline 6.1 
+0

Puede dejar los nombres de columna siempre que los valores coincidan con el orden de las columnas. Puede considerarse una mala práctica hacerlo, pero para una inserción rápida de una sola vez es una buena solución. – Shahar

+0

@Shahar Esto es mucho mejor que dejar el nombre de la columna. De esta manera, tienes una mejor idea de lo que está sucediendo en tu SQL – user3284463

+0

@ user3284463 Estoy totalmente de acuerdo, solo creo que vale la pena mencionarlo. – Shahar

Cuestiones relacionadas