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

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

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


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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.