Làm cách nào để chèn dữ liệu vào MySQL có khóa chính tăng tự động?


86

Tôi đã tạo một bảng có khóa chính và được kích hoạt AUTO_INCREMENT, làm cách nào để sử dụng 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)
);

Đây là truy vấn tôi đã sử dụng, tôi đã thử "" và "1" cho giá trị đầu tiên nhưng nó không hoạt động.

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

Câu trả lời:


72

Để tận dụng khả năng tăng tự động của cột, không cung cấp giá trị cho cột đó khi chèn hàng. Cơ sở dữ liệu sẽ cung cấp một giá trị cho bạn.

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
Hoặc chỉ cần vượt qua NULL
Adrian Cornish

nhưng truy vấn bạn dán cho tôi bạn đặt giá trị cho khóa sơ khai ??
Salman Raza

3
@SalmanRaza: không, hãy xem: cột "hostcheck_id" bị thiếu trong truy vấn tôi đã đề xuất. Tôi đã đưa ra các giá trị chỉ cho 23 cột nhưng có 24 cột trong bảng. Tôi đoán gợi ý của Adrian cũng sẽ hiệu quả, nhưng tôi không biết bạn có thể làm được điều đó!
Celada

4
@Celada điều tuyệt vời về trang web này - bạn học được điều gì đó ngay cả khi câu trả lời của chính bạn là đúng :-)
Adrian Cornish

1
@All cảm ơn bạn đã trả lời! nó giúp tôi ra tôi vượt qua '0' giá trị cho cột then chốt primery
Salman Raza

153

Đặt trường tăng tự động thành NULL hoặc 0 nếu bạn muốn nó được gán tự động một cách kỳ diệu ...


Điều này hoạt động đối với tôi không giống như bỏ qua giá trị cột tự động tăng.
ASten ngày

3
Ưu tiên NULL, vì 0hành vi của có thể bị ảnh hưởng bởi NO_AUTO_VALUE_ON_ZERO .
Benjamin

14

Các defaulttừ khóa làm việc cho tôi:

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)

Tôi đang chạy mysql --version5.1.66:

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

Bạn có thể để trống tên cột miễn là các giá trị khớp với thứ tự của các cột. Nó có thể được coi là thực hành xấu để làm điều đó, nhưng để chèn nhanh một lần, đó là một giải pháp tốt.
Shahar

@Shahar Điều này tốt hơn nhiều so với việc bỏ tên cột. Bằng cách này, bạn có một ý tưởng tốt hơn về những gì đang xảy ra trong SQL của bạn
GoalsAndGambles

@ user3284463 Tôi hoàn toàn đồng ý, tôi chỉ nghĩ rằng nó đáng nói.
Shahar

1
Vâng, vấn đề là thứ tự có thể khớp NGAY BÂY GIỜ nhưng sẽ không nhất thiết khớp khi sql được chạy SAU.
Kzqai

Cảm ơn rất nhiều, đối với potgres 10.10 không được phép đặt giá trị 0 hoặc null, nhưng với mặc định nó hoạt động;
tarmogoyf

11

Kiểm tra bài đăng này

Theo nó

Không có giá trị nào được chỉ định cho cột AUTO_INCREMENT, vì vậy MySQL tự động gán số thứ tự. Bạn cũng có thể gán rõ ràng NULL hoặc 0 cho cột để tạo số thứ tự.


3

Tôi thấy có ba khả năng ở đây sẽ giúp bạn chèn vào bảng của mình mà không làm lộn xộn hoàn toàn nhưng "chỉ định" một giá trị cho cột AUTO_INCREMENT , vì bạn đang cung cấp tất cả các giá trị mà bạn có thể thực hiện một trong các tùy chọn sau.

Cách tiếp cận đầu tiên (Cung cấp 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'
);

Cách tiếp cận thứ hai (Cung cấp '' {Dấu ngoặc kép / dấu nháy đơn} mặc dù nó sẽ đưa ra cảnh báo cho bạn):

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

Cách tiếp cận thứ ba (Cung cấp mặc định ):

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

Một trong hai ví dụ này là đủ khi chèn vào bảng đó miễn là bạn bao gồm tất cả các giá trị theo thứ tự như bạn đã xác định chúng khi tạo bảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.