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