Wie füge ich Daten in MySQL ein, wenn der Primärschlüssel automatisch erhöht wurde?

86

Ich habe eine Tabelle mit einem Primärschlüssel erstellt und aktiviert AUTO_INCREMENT. Wie kann ich MYSQL verwenden 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)
);

Hier ist die Abfrage, die ich verwendet habe. Ich habe "" und "1" für den ersten Wert ausprobiert, aber es funktioniert nicht.

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
quelle

Antworten:

72

Geben Sie beim Einfügen von Zeilen keinen Wert für diese Spalte an, um die automatische Inkrementierungsfunktion der Spalte zu nutzen. Die Datenbank liefert einen Wert für Sie.

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
quelle
133
Oder einfach NULL
Adrian Cornish
aber die Abfrage, die Sie für mich eingefügt haben, setzen Sie Wert für Primery Key?
Salman Raza
3
@SalmanRaza: Nein, schauen Sie: Die Spalte "hostcheck_id" fehlt in der von mir vorgeschlagenen Abfrage. Ich habe nur Werte für 23 Spalten angegeben, aber die Tabelle enthält 24 Spalten. Ich denke, Adrians Vorschlag würde auch funktionieren, aber ich wusste nicht, dass Sie das tun können!
Celada
4
@ Celada tolle Sache über diese Seite - Sie lernen etwas, auch wenn Ihre eigene Antwort richtig ist :-)
Adrian Cornish
1
@All danke für deine Antwort! es hilft mir, ich übergebe '0' Wert für Primery Key Spalte
Salman Raza
152

Setzen Sie das Auto-Inkrement-Feld auf NULL oder 0, wenn Sie möchten, dass es automatisch magisch zugewiesen wird ...

Adrian Cornish
quelle
Dies funktioniert bei mir im Gegensatz zum Überspringen des Spaltenwerts für die automatische Inkrementierung.
ASten
3
Bevorzugen NULL, da 0das Verhalten von NO_AUTO_VALUE_ON_ZERO beeinflusst werden kann .
Benjamin
14

Das defaultSchlüsselwort funktioniert bei mir:

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)

Ich verwende mysql --version5.1.66:

mysql  Ver 14.14 Distrib **5.1.66**, for debian-linux-gnu (x86_64) using readline 6.1
Kzqai
quelle
Sie können die Spaltennamen weglassen, solange die Werte mit der Reihenfolge der Spalten übereinstimmen. Es kann als schlechte Praxis angesehen werden, dies zu tun, aber für eine einmalige schnelle Einfügung ist es eine gute Lösung.
Shahar
@ Shahar Dies ist viel besser, als den Spaltennamen wegzulassen. Auf diese Weise haben Sie eine bessere Vorstellung davon, was in Ihrem SQL
GoalsAndGambles
@ user3284463 Ich stimme vollkommen zu, ich denke nur, dass es erwähnenswert ist.
Shahar
1
Ja, das Problem ist, dass die Reihenfolge JETZT übereinstimmt, aber nicht unbedingt übereinstimmt, wenn die SQL später ausgeführt wird.
Kzqai
Vielen Dank, für potgres 10.10 ist es nicht erlaubt, 0- oder Nullwerte zu setzen, aber standardmäßig funktioniert es;
Tarmogoyf
11

Schauen Sie sich diesen Beitrag an

Demnach

Für die Spalte AUTO_INCREMENT wurde kein Wert angegeben, daher hat MySQL automatisch Sequenznummern zugewiesen. Sie können der Spalte auch explizit NULL oder 0 zuweisen, um Sequenznummern zu generieren.

Amar Palsapure
quelle
3

Ich sehe hier drei Möglichkeiten, die Ihnen helfen, in Ihre Tabelle einzufügen, ohne ein komplettes Durcheinander zu verursachen, aber einen Wert für die Spalte AUTO_INCREMENT "anzugeben" , da Sie alle Werte angeben, können Sie eine der folgenden Optionen ausführen.

Erster Ansatz ( NULL liefern ):

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

Zweiter Ansatz (Bereitstellung von '' {einfache Anführungszeichen / Apostrophe}, obwohl Sie eine Warnung erhalten):

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

Dritter Ansatz ( Standard liefern ):

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

Jedes dieser Beispiele sollte beim Einfügen in diese Tabelle ausreichen, solange Sie alle Werte in derselben Reihenfolge angeben, in der Sie sie beim Erstellen der Tabelle definiert haben.

Xedret
quelle