Come inserire dati in MySQL con chiave primaria auto incrementata?


88

Ho creato una tabella con una chiave primaria e abilitata AUTO_INCREMENT, come posso utilizzare 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)
);

Ecco la query che ho usato, ho provato "" e "1" per il primo valore ma non funziona.

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

Risposte:


74

Per sfruttare la capacità di incremento automatico della colonna, non fornire un valore per quella colonna quando si inseriscono le righe. Il database fornirà un valore per te.

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

ma la query che hai incollato per me hai messo valore per la chiave primaria ??
Salman Raza

3
@SalmanRaza: no, guarda: la colonna "hostcheck_id" non è presente nella query che ho suggerito. Ho dato valori solo per 23 colonne ma ci sono 24 colonne nella tabella. Immagino che anche il suggerimento di Adrian avrebbe funzionato, ma non sapevo che potessi farlo!
Celada

4
@Celada grande cosa di questo sito - impari qualcosa anche quando la tua risposta è corretta :-)
Adrian Cornish

1
@Tutti grazie per la tua risposta! mi aiuta a passare il valore '0' per la colonna chiave primaria
Salman Raza

153

Imposta il campo di incremento automatico su NULL o 0 se vuoi che venga assegnato automaticamente magicamente ...


Questo funziona per me a differenza del salto del valore della colonna di incremento automatico.
ASten

3
Preferisco NULL, poiché 0il comportamento di può essere influenzato da NO_AUTO_VALUE_ON_ZERO .
Benjamin

14

La defaultparola chiave funziona per me:

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)

Sto eseguendo mysql --version5.1.66:

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

Puoi lasciare fuori i nomi delle colonne fintanto che i valori corrispondono all'ordine delle colonne. Può essere considerato una cattiva pratica farlo, ma per un inserimento rapido una tantum è una buona soluzione.
Shahar

@ Shahar Questo è molto meglio che lasciare fuori il nome della colonna. In questo modo, hai un'idea migliore di cosa sta succedendo nel tuo SQL
Rusty

@ user3284463 Sono totalmente d'accordo, penso solo che valga la pena menzionarlo.
Shahar

1
Sì, il problema è che l'ordine potrebbe corrispondere ADESSO ma non corrisponderà necessariamente quando sql verrà eseguito DOPO.
Kzqai

Grazie mille, per potgres 10.10 non è permesso mettere 0 o valori nulli, ma di default funziona;
tarmogoyf

11

Dai un'occhiata a questo post

Secondo esso

Non è stato specificato alcun valore per la colonna AUTO_INCREMENT, quindi MySQL ha assegnato automaticamente i numeri di sequenza. È inoltre possibile assegnare esplicitamente NULL o 0 alla colonna per generare numeri di sequenza.


3

Vedo tre possibilità qui che ti aiuteranno a inserire nella tua tabella senza fare un pasticcio completo ma "specificando" un valore per la colonna AUTO_INCREMENT , dato che stai fornendo tutti i valori puoi fare una delle seguenti opzioni.

Primo approccio (fornitura di 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'
);

Secondo approccio (fornire '' {Simple quotes / apostrofi} anche se ti darà un avviso):

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

Terzo approccio (fornitura predefinita ):

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

Uno di questi esempi dovrebbe essere sufficiente quando si inserisce in quella tabella purché si includano tutti i valori nello stesso ordine in cui sono stati definiti durante la creazione della tabella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.