Otomatik olarak artan birincil anahtara sahip MySQL'e veri nasıl eklenir?


88

Birincil anahtarla bir tablo oluşturdum ve etkinleştirdim AUTO_INCREMENT, MYSQL'i nasıl kullanabilirim 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)
);

İşte kullandığım sorgu, ilk değer için "" ve "1" denedim ama çalışmıyor.

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

Yanıtlar:


74

Sütunun otomatik artma özelliğinden yararlanmak için, satırları eklerken o sütun için bir değer sağlamayın. Veritabanı sizin için bir değer sağlayacaktır.

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

ama benim için yapıştırdığınız sorgu, birincil anahtar için değer mi koyuyorsunuz?
Salman Raza

3
@SalmanRaza: hayır, bakın: önerdiğim sorguda "hostcheck_id" sütunu eksik. Sadece 23 sütun için değer verdim ama tabloda 24 sütun var. Sanırım Adrian'ın önerisi de işe yarardı, ama bunu yapabileceğini bilmiyordum!
Celada

4
@Celada bu site hakkında harika bir şey - kendi cevabınız doğru olsa bile bir şeyler öğreniyorsunuz :-)
Adrian Cornish

1
@ Cevabınız için teşekkürler! bu bana yardımcı oluyor birincil anahtar sütunu için '0' değerini geçiyorum
Salman Raza

153

Otomatik olarak sihirli bir şekilde atanmasını istiyorsanız, otomatik artış alanını NULL veya 0 olarak ayarlayın ...


Bu, otomatik artış sütun değerini atlamanın aksine benim için çalışıyor.
ASten

3
Tercih NULLolarak, 0bireyin davranış etkilenebilir NO_AUTO_VALUE_ON_ZERO .
Benjamin

14

defaultAnahtar kelime benim için çalışıyor:

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)

Koşuyorum mysql --version5.1.66:

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

Değerler sütunların sırasına uygun olduğu sürece sütun adlarını dışarıda bırakabilirsiniz. Bunu yapmak kötü bir uygulama olarak kabul edilebilir, ancak tek seferlik hızlı bir giriş için bu iyi bir çözümdür.
Shahar

@Shahar Bu, sütun adını dışarıda bırakmaktan çok daha iyidir. Bu şekilde,
Rusty

@ user3284463 Tamamen katılıyorum, sadece bahsetmeye değer olduğunu düşünüyorum.
Shahar

1
Evet, sorun şu ki, sıra ŞİMDİ eşleşebilir, ancak sql DAHA SONRA çalıştırıldığında mutlaka eşleşmeyecektir.
Kzqai

Çok teşekkürler, potgres için 10.10'un 0 veya boş değerler koymasına izin verilmez, ancak varsayılan olarak çalışır;
tarmogoyf

11

Bu gönderiye göz atın

Buna göre

AUTO_INCREMENT sütunu için değer belirtilmedi, bu nedenle MySQL otomatik olarak sıra numaralarını atadı. Ayrıca sıra numaraları oluşturmak için sütuna açıkça NULL veya 0 atayabilirsiniz.


3

Burada tam bir karmaşa yaratmadan tablonuza eklemenize yardımcı olacak üç olasılık görüyorum, ancak AUTO_INCREMENT sütunu için bir değer "belirterek" , tüm değerleri sağladığınız için aşağıdaki seçeneklerden birini yapabilirsiniz.

İlk yaklaşım ( NULL Sağlama ):

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

İkinci yaklaşım ( '' {Basit tırnak / kesme işareti} sağlamak, ancak sizi bir uyarı verecektir):

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

Üçüncü yaklaşım ( Temerrüt sağlama ):

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

Tabloyu oluştururken tanımladığınız gibi tüm değerleri aynı sırayla dahil ettiğiniz sürece, bu örneklerden herhangi biri o tabloya eklerken yeterli olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.