Як вставити дані в 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
Або просто здайте НУЛЬ
Адріан Корніш

але запит, який ви вставили для мене, ви поклали значення для елементарного ключа ??
Salman Raza

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

4
@Celada чудова річ на цьому сайті - ви дізнаєтесь щось, навіть коли ваша відповідь правильна :-)
Адріан Корніш

1
@ Дякую за відповідь! це допомагає мені, я передаю значення "0" для базового стовпця ключа
Salman Raza

152

Встановіть для поля автоматичного збільшення значення NULL або 0, якщо ви хочете, щоб воно було автоматично призначено магічно ...


Це працює для мене на відміну від пропуску значення стовпця автоінкременту.
Астен

3
Надайте перевагу NULL, оскільки 0на поведінку користувача може впливати NO_AUTO_VALUE_ON_ZERO .
Бенджамін

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 Це набагато краще, ніж залишити назву стовпця. Таким чином, ви краще уявляєте, що відбувається у вашому SQL
GoalsAndGambles

@ user3284463 Я повністю згоден, я просто думаю, що це варто згадати.
Шахар

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.