如何将数据插入具有自动递增主键的MySQL?


86

我创建了一个具有主键的表并启用了该表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'); 

Answers:


72

为了利用列的自动递增功能,在插入行时不要为该列提供值。数据库将为您提供一个值。

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
或只是传递NULL
Adrian Cornish 2012年

但是您为我粘贴的查询中您输入了入门密钥值?
Salman Raza 2012年

3
@SalmanRaza:不,外观:我建议的查询中缺少“ hostcheck_id”列。我只给出了23列的值,但表中有24列。我想Adrian的建议也可以,但是我不知道您能做到!
Celada'1

4
@Celada这个网站很棒的事情-即使您自己的回答正确,您也可以学到一些东西:-)
Adrian Cornish 2012年

1
@All感谢您的回复!它帮了我忙,我为入门键列传递了“ 0”值
Salman Raza 2012年


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

只要值与列顺序匹配,就可以省略列名称。这样做可能被认为是不好的做法,但是对于一次性快速插入而言,这是一个很好的解决方案。
沙哈尔2015年

@Shahar这比省略列名要好得多。通过这种方式,您可以更好地了解SQL中发生的事情
GoalsAndGambles

@ user3284463我完全同意,我只是认为值得一提。
沙哈尔(Shahar)2016年

1
是的,问题在于该命令可能现在匹配,但是以后运行sql时不一定匹配。
喀恰

非常感谢,potgres 10.10不允许放置0或null值,但默认情况下可以使用;
tarmogoyf


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

第二种方法(提供 {简单的引号/撇号},尽管会警告您):

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

只要您以创建表时定义的相同顺序包含所有值,将这些示例中的任何一个插入该表就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.