【问题标题】:How to insert data to MySQL having auto incremented primary key?如何将数据插入具有自动递增主键的 MySQL?
【发布时间】:2012-02-03 22:03:20
【问题描述】:

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

【问题讨论】:

    标签: mysql insert


    【解决方案1】:

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

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

    【讨论】:

    • 但是您为我粘贴的查询为primery key设置了值??
    • @SalmanRaza:不,看:我建议的查询中缺少“hostcheck_id”列。我只给出了 23 列的值,但表中有 24 列。我想 Adrian 的建议也可以,但我不知道你能做到!
    • @Celada 这个网站很棒——即使你自己的答案是正确的,你也会学到一些东西:-)
    • @All 感谢您的回复!它可以帮助我为初级键列传递“0”值
    【解决方案2】:

    如果您希望自动神奇地分配自动增量字段,请将其设置为 NULL 或 0...

    【讨论】:

    • 这对我有用,不像跳过自动增量列值。
    • 首选NULL,因为0的行为会受到NO_AUTO_VALUE_ON_ZERO的影响。
    【解决方案3】:

    查看this 帖子

    据此

    没有为 AUTO_INCREMENT 列指定值,所以 MySQL 自动分配序列号。您也可以明确地 将 NULL 或 0 分配给列以生成序列号。

    【讨论】:

      【解决方案4】:

      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 --version 5.1.66:

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

      【讨论】:

      • 只要值与列的顺序匹配,您就可以省略列名。这样做可能被认为是不好的做法,但对于一次性快速插入来说,这是一个很好的解决方案。
      • @Shahar 这比留下列名要好得多。通过这种方式,您可以更好地了解您的 SQL 中发生了什么
      • @user3284463 我完全同意,我只是觉得值得一提。
      • 是的,问题是订单现在可能匹配,但稍后运行sql时不一定匹配。
      • 非常感谢,因为 potgres 10.10 不允许输入 0 或 null 值,但默认情况下它可以工作;
      【解决方案5】:

      我在这里看到了三种可能性,它们可以帮助您插入表格而不会弄得一团糟,但 “指定”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'
      );
      

      只要您按照创建表时定义它们的顺序包含所有值,在插入该表时,这些示例中的任何一个都应该足够了。

      【讨论】:

        【解决方案6】:

        我使用类似的方法在我的 SQL 请求中只键入值。 我的专栏太多了,我很懒。

        insert into my_table select max(id)+1, valueA, valueB, valueC.... from my_table; 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          • 2014-10-03
          • 1970-01-01
          • 2012-02-22
          相关资源
          最近更新 更多