Como inserir dados no MySQL com chave primária incrementada automaticamente?

86

Eu criei uma tabela com uma chave primária e habilitada AUTO_INCREMENT, como faço para usar o 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)
);

Aqui está a consulta que usei, tentei "" e "1" para o primeiro valor, mas não 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
fonte

Respostas:

72

Para aproveitar as vantagens da capacidade de incremento automático da coluna, não forneça um valor para essa coluna ao inserir linhas. O banco de dados fornecerá um valor para você.

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
fonte
133
Ou apenas passe NULL
Adrian Cornish
mas a query que você colou pra mim você colocou valor para a chave primery ??
Salman Raza
3
@SalmanRaza: não, olha: a coluna "hostcheck_id" está faltando na consulta que sugeri. Eu dei valores para apenas 23 colunas, mas existem 24 colunas na tabela. Acho que a sugestão de Adrian também funcionaria, mas não sabia que você poderia fazer isso!
Celada
4
@Celada grande coisa sobre este site - você aprende algo mesmo quando sua própria resposta está correta :-)
Adrian Cornish
1
@Tudo obrigado pela sua resposta! me ajuda a passar o valor '0' para a coluna da chave primária
Salman Raza
153

Defina o campo de incremento automático como NULL ou 0 se quiser que ele seja atribuído automaticamente por mágica ...

Adrian Cornish
fonte
Isso funciona para mim ao contrário de ignorar o valor da coluna de incremento automático.
ASten
3
Prefira NULL, pois 0o comportamento de pode ser afetado por NO_AUTO_VALUE_ON_ZERO .
Benjamin
14

A defaultpalavra-chave funciona para mim:

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)

Estou executando mysql --version5.1.66:

mysql  Ver 14.14 Distrib **5.1.66**, for debian-linux-gnu (x86_64) using readline 6.1
Kzqai
fonte
Você pode deixar os nomes das colunas de fora, desde que os valores correspondam à ordem das colunas. Pode ser considerado uma prática ruim fazê-lo, mas para uma inserção rápida única é uma boa solução.
Shahar de
@Shahar Isso é muito melhor do que omitir o nome da coluna. Desta forma, você tem uma ideia melhor do que está acontecendo em seu SQL
GoalsAndGambles
@ user3284463 Concordo totalmente, só acho que vale a pena mencionar.
Shahar de
1
Sim, o problema é que o pedido pode corresponder AGORA, mas não necessariamente quando o sql for executado DEPOIS.
Kzqai
Muito obrigado, para potgres 10.10 não é permitido colocar 0 ou valores nulos, mas com o padrão funciona;
tarmogoyf
11

Confira esta postagem

De acordo com isso

Nenhum valor foi especificado para a coluna AUTO_INCREMENT, então o MySQL atribuiu números de sequência automaticamente. Você também pode atribuir explicitamente NULL ou 0 à coluna para gerar números de sequência.

Amar Palsapure
fonte
3

Eu vejo três possibilidades aqui que o ajudarão a inserir em sua tabela sem fazer uma bagunça completa, mas "especificando" um valor para AUTO_INCREMENT coluna , uma vez que você está fornecendo todos os valores, você pode fazer uma das seguintes opções.

Primeira abordagem (fornecendo 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'
);

Segunda abordagem (Fornecendo '' {aspas / apóstrofos}, embora dê um aviso):

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

Terceira abordagem ( padrão de fornecimento ):

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

Qualquer um desses exemplos deve ser suficiente ao inserir nessa tabela, desde que você inclua todos os valores na mesma ordem em que os definiu ao criar a tabela.

Xedret
fonte