Jak wstawić dane do MySQL mając automatycznie zwiększany klucz podstawowy?

86

Utworzyłem tabelę z kluczem podstawowym i włączono AUTO_INCREMENT, jak mogę korzystać z 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)
);

Oto zapytanie, którego użyłem, próbowałem „” i „1” dla pierwszej wartości, ale nie działa.

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
źródło

Odpowiedzi:

72

Aby skorzystać z możliwości automatycznego zwiększania wartości kolumny, nie należy podawać wartości dla tej kolumny podczas wstawiania wierszy. Baza danych dostarczy Ci wartość.

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
źródło
133
Lub po prostu podaj NULL
Adrian Cornish
ale zapytanie, które dla mnie wkleiłeś, umieściłeś wartość dla klucza podstawowego?
Salman Raza,
3
@SalmanRaza: nie, spójrz: w zapytaniu, które zasugerowałem, brakuje kolumny "hostcheck_id". Podałem wartości tylko dla 23 kolumn, ale w tabeli są 24 kolumny. Myślę, że sugestia Adriana też się sprawdzi, ale nie wiedziałem, że możesz to zrobić!
Celada
4
@Celada wspaniała rzecz o tej witrynie - można się czegoś nauczyć nawet wtedy, gdy Twoja własna odpowiedź jest poprawna :-)
Adrian Cornish,
1
@ Dzięki za odpowiedź! to mi pomaga, przekazuję wartość '0' dla podstawowej kolumny klucza
Salman Raza
153

Ustaw pole automatycznego przyrostu na NULL lub 0, jeśli chcesz, aby było automatycznie przypisywane magicznie ...

Adrian Cornish
źródło
Działa to dla mnie w przeciwieństwie do pomijania wartości kolumny autoincrement.
ASten
3
Preferuj NULL, ponieważ NO_AUTO_VALUE_ON_ZERO0 może wpłynąć na zachowanie .
Benjamin
14

Słowo defaultkluczowe działa dla mnie:

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)

Używam mysql --version5.1.66:

mysql  Ver 14.14 Distrib **5.1.66**, for debian-linux-gnu (x86_64) using readline 6.1
Kzqai
źródło
Możesz pozostawić nazwy kolumn, o ile wartości są zgodne z kolejnością kolumn. Może to zostać uznane za złą praktykę, ale w przypadku jednorazowej, szybkiej wkładki jest to dobre rozwiązanie.
Shahar
@Shahar To o wiele lepsze niż pozostawienie nazwy kolumny. W ten sposób masz lepsze wyobrażenie o tym, co dzieje się w twoim SQL
GoalsAndGambles
@ user3284463 Całkowicie się zgadzam, myślę, że warto o tym wspomnieć.
Shahar,
1
Tak, problem polega na tym, że kolejność może być zgodna TERAZ, ale niekoniecznie będzie zgodna, gdy sql zostanie uruchomione PÓŹNIEJ.
Kzqai,
Wielkie dzięki, dla potgres 10.10 nie może umieszczać wartości 0 ani null, ale domyślnie działa;
tarmogoyf
11

Sprawdź ten post

Zgodnie z tym

Nie określono wartości dla kolumny AUTO_INCREMENT, więc MySQL automatycznie przypisał numery porządkowe. Możesz również jawnie przypisać NULL lub 0 do kolumny, aby wygenerować numery sekwencyjne.

Amar Palsapure
źródło
3

Widzę tutaj trzy możliwości, które pomogą ci wstawić do tabeli bez robienia kompletnego bałaganu, ale „określając” wartość kolumny AUTO_INCREMENT , ponieważ podajesz wszystkie wartości, które możesz wykonać jedną z poniższych opcji.

Pierwsze podejście (dostarczanie wartości 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'
);

Drugie podejście (podanie '' {Simple quotes / apostrofhes}, chociaż da ci to ostrzeżenie):

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

Trzecie podejście (dostawa domyślna ):

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

Każdy z tych przykładów powinien wystarczyć przy wstawianiu do tej tabeli, o ile uwzględniasz wszystkie wartości w tej samej kolejności, w jakiej zostały zdefiniowane podczas tworzenia tabeli.

Xedret
źródło