Как вставить данные в 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'); 

Ответы:


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
Адриан Корниш

но запрос, который вы вставили для меня, вы указали значение для простого ключа ??
Салман Раза,

3
@SalmanRaza: нет, посмотри: столбец hostcheck_id отсутствует в предложенном мной запросе. Я привел значения только для 23 столбцов, но в таблице 24 столбца. Думаю, предложение Адриана тоже сработает, но я не знал, что вы сможете это сделать!
Celada

4
@Celada - замечательный момент в этом сайте - вы узнаете кое-что, даже если ваш собственный ответ правильный :-)
Адриан Корниш

1
@ Всем спасибо за ответ! это поможет мне, я передаю значение «0» для основного ключевого столбца
Салман Раза,

153

Установите для поля автоинкремента значение NULL или 0, если вы хотите, чтобы оно автоматически присваивалось магическим образом ...


Это работает для меня, в отличие от пропуска значения столбца автоинкремента.
ASten 03

3
Предпочитаю NULL, поскольку 0на поведение пользователя 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
GoalsAndGambles

@ user3284463 Полностью согласен, думаю, стоит упомянуть.
Shahar

1
Да, проблема в том, что порядок может совпадать СЕЙЧАС, но не обязательно совпадать, когда sql запускается ПОЗЖЕ.
Kzqai

Большое спасибо, для potgres 10.10 не разрешено ставить 0 или нулевые значения, но по умолчанию это работает;
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'
);

Второй подход (поставка '' {Простые кавычки / апострофы}, хотя это даст вам предупреждение):

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

Любого из этих примеров должно хватить при вставке в эту таблицу, если вы включаете все значения в том же порядке, в каком вы определили их при создании таблицы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.