วิธีแทรกข้อมูลไปยัง MySQL โดยมีคีย์หลักที่เพิ่มขึ้นอัตโนมัติ


88

ฉันได้สร้างตารางด้วยคีย์หลักและเปิดใช้งานAUTO_INCREMENTแล้วฉันจะใช้ 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)
);

นี่คือข้อความค้นหาที่ฉันใช้ฉันได้ลองใช้ "" และ "1" สำหรับค่าแรก แต่ไม่ได้ผล

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

คำตอบ:


74

ในการใช้ประโยชน์จากความสามารถในการเพิ่มอัตโนมัติของคอลัมน์อย่าระบุค่าสำหรับคอลัมน์นั้นเมื่อแทรกแถว ฐานข้อมูลจะให้คุณค่าแก่คุณ

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

แต่แบบสอบถามที่คุณวางให้ฉันคุณใส่ค่าสำหรับไพรเมอรี่คีย์ ??
Salman Raza

3
@SalmanRaza: ไม่ดู: คอลัมน์ "hostcheck_id" หายไปจากข้อความค้นหาที่ฉันแนะนำ ฉันให้ค่าเพียง 23 คอลัมน์ แต่มี 24 คอลัมน์ในตาราง ฉันเดาว่าคำแนะนำของเอเดรียนก็ใช้ได้เช่นกัน แต่ฉันไม่รู้ว่าคุณทำได้!
Celada

4
@Celada สิ่งที่ยอดเยี่ยมเกี่ยวกับไซต์นี้ - คุณได้เรียนรู้บางสิ่งแม้ว่าคำตอบของคุณเองจะถูกต้อง :-)
Adrian Cornish

1
@ ขอบคุณสำหรับการตอบกลับของคุณ! ช่วยฉันด้วยฉันส่งค่า '0' สำหรับคอลัมน์คีย์ไพรเมอรี่
Salman Raza

153

ตั้งค่าช่องเพิ่มอัตโนมัติเป็น NULL หรือ 0 ถ้าคุณต้องการให้มันกำหนดโดยอัตโนมัติอย่างน่าอัศจรรย์ ...


สิ่งนี้ใช้ได้กับฉันซึ่งแตกต่างจากการข้ามค่าคอลัมน์การเพิ่มอัตโนมัติ
ASten

3
ต้องการNULLเป็น0พฤติกรรม 's ได้รับผลกระทบโดยNO_AUTO_VALUE_ON_ZERO
Benjamin

14

defaultคำหลักที่ทำงานสำหรับฉัน:

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)

ฉันใช้mysql --version5.1.66:

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

คุณสามารถปล่อยชื่อคอลัมน์ไว้ได้ตราบเท่าที่ค่าตรงกับลำดับของคอลัมน์ อาจถือเป็นการปฏิบัติที่ไม่ดีในการทำ แต่สำหรับการใส่อย่างรวดเร็วเพียงครั้งเดียวก็เป็นทางออกที่ดี
Shahar

@Shahar นี่ดีกว่าปล่อยชื่อคอลัมน์ออกไป ด้วยวิธีนี้คุณจะมีความคิดที่ดีขึ้นว่าเกิดอะไรขึ้นใน SQL ของคุณ
Rusty

@ user3284463 ฉันเห็นด้วยอย่างยิ่งฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึง
Shahar

1
ใช่ปัญหาคือคำสั่งซื้ออาจตรงกับ NOW แต่ไม่จำเป็นต้องตรงกันเมื่อ SQL ถูกเรียกใช้ LATER
Kzqai

ขอบคุณมากสำหรับ potgres 10.10 ไม่ได้รับอนุญาตให้ใส่ 0 หรือค่า null แต่ด้วยค่าเริ่มต้นมันใช้งานได้
tarmogoyf

11

ลองดูโพสต์นี้

ตามนั้น

ไม่ได้ระบุค่าสำหรับคอลัมน์ AUTO_INCREMENT ดังนั้น MySQL จึงกำหนดหมายเลขลำดับโดยอัตโนมัติ คุณยังสามารถกำหนดค่า NULL หรือ 0 ให้กับคอลัมน์อย่างชัดเจนเพื่อสร้างหมายเลขลำดับ


3

ฉันเห็นความเป็นไปได้สามประการที่นี่ซึ่งจะช่วยให้คุณแทรกลงในตารางของคุณได้โดยไม่ต้องวุ่นวาย แต่เป็นการ"ระบุ"ค่าสำหรับAUTO_INCREMENTคอลัมน์เนื่องจากคุณกำลังระบุค่าทั้งหมดที่คุณสามารถทำอย่างใดอย่างหนึ่งในตัวเลือกต่อไปนี้

แนวทางแรก (จัดหา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'
);

แนวทางที่สอง (จัดหา'' {Simple quotes / apostrophes} แม้ว่าจะให้คำเตือน):

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

แนวทางที่สาม (จัดหาค่าเริ่มต้น ):

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

ตัวอย่างใดตัวอย่างหนึ่งเหล่านี้ควรเพียงพอเมื่อแทรกลงในตารางนั้นตราบใดที่คุณรวมค่าทั้งหมดในลำดับเดียวกับที่คุณกำหนดไว้เมื่อสร้างตาราง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.