¿Cómo insertar datos en MySQL con clave primaria autoincrementada?

86

Creé una tabla con una clave principal y la habilité AUTO_INCREMENT, ¿cómo consigo el uso de MYSQL AUTO_INCREMENT?

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)
);

Aquí está la consulta que utilicé, probé "" 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'); 
Salman Raza
fuente

Respuestas:

72

Para aprovechar la capacidad de incremento automático de la columna, no proporcione 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'
);
Celada
fuente
133
O simplemente pase NULL
Adrian Cornish
pero la consulta que me pegaste, ¿le pusiste valor a la clave de primery?
Salman Raza
3
@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. Supongo que la sugerencia de Adrian también funcionaría, ¡pero no sabía que podías hacer eso!
Celada
4
@Celada es una gran cosa sobre este sitio: aprendes algo incluso cuando tu propia respuesta es correcta :-)
Adrian Cornish
1
@¡Todas las gracias por tu respuesta! me ayuda, paso el valor '0' para la columna de clave de imprimación
Salman Raza
153

Establezca el campo de incremento automático en NULL o 0 si desea que se asigne automáticamente por arte de magia ...

Adrian Cornish
fuente
Esto funciona para mí a diferencia de omitir el valor de la columna de aumento automático.
ASten
3
Preferir NULL, 0el comportamiento de as puede verse afectado por NO_AUTO_VALUE_ON_ZERO .
Benjamín
14

La defaultpalabra 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 ejecutando mysql --version5.1.66:

mysql  Ver 14.14 Distrib **5.1.66**, for debian-linux-gnu (x86_64) using readline 6.1
Kzqai
fuente
Puede omitir los nombres de las columnas 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 única es una buena solución.
Shahar
@Shahar Esto es mucho mejor que omitir el nombre de la columna. De esta manera, tiene una mejor idea de lo que está sucediendo en su SQL
GoalsAndGambles
@ user3284463 Estoy totalmente de acuerdo, solo creo que vale la pena mencionarlo.
Shahar
1
Sí, el problema es que el orden puede coincidir AHORA, pero no necesariamente coincidirá cuando se ejecute sql MÁS TARDE.
Kzqai
Muchas gracias, para potgres 10.10 no se permite poner 0 o valores nulos, pero por defecto funciona;
tarmogoyf
11

Mira esta publicación

De acuerdo a esto

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

Amar Palsapure
fuente
3

Veo tres posibilidades aquí que lo ayudarán a insertar en su tabla sin hacer un lío completo, pero "especificando" un valor para la columna AUTO_INCREMENT , ya que está proporcionando todos los valores, puede hacer una de las siguientes opciones.

Primer enfoque (proporcionando NULL ):

INSERT INTO test.authors VALUES (
 NULL,'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'
);

Segundo enfoque (proporcionando '' {comillas / apóstrofos simples} aunque le dará una advertencia):

INSERT INTO test.authors 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'
);

Tercer enfoque (suministro predeterminado ):

INSERT INTO test.authors VALUES (
 default,'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'
);

Cualquiera de estos ejemplos debería ser suficiente al insertar en esa tabla, siempre que incluya todos los valores en el mismo orden en que los definió al crear la tabla.

Xedret
fuente