自動インクリメントされた主キーを持つMySQLにデータを挿入する方法は?


88

主キーを使用してテーブルを作成して有効にしましたが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'); 

回答:


74

列の自動インクリメント機能を利用するために、行を挿入するときにその列の値を指定しないでください。データベースはあなたに価値を提供します。

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

しかし、あなたが私のために貼り付けたクエリは、プライマーキーに価値を置きますか?
サルマンラザ2012年

3
@SalmanRaza:いいえ、見てください:「hostcheck_id」列が私が提案したクエリから欠落しています。23列のみの値を指定しましたが、テーブルには24列あります。エイドリアンの提案もうまくいくと思いますが、あなたがそれを行うことができるとは知りませんでした!
セラダ2012年

4
@Celadaこのサイトの素晴らしいところ-自分の答えが正しい場合でも何かを学ぶ:
Adrian Cornish

1
@お返事ありがとうございます!プライマーキー列の「0」値を渡すのに役立ちます
Salman Raza


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で何が起こっているかをよりよく理解できます
Rusty

@ user3284463私は完全に同意します、私はそれが言及する価値があると思います。
Shahar 2016

1
ええ、問題は、順序が今は一致するかもしれませんが、SQLが後で実行されるときに必ずしも一致するとは限らないということです。
kzqai 2016年

どうもありがとうございました。potgres10.10では0またはnull値を入力することは許可されていませんが、デフォルトでは機能します。
tarmogoyf

11

この投稿をチェックしてください

それによると

AUTO_INCREMENT列に値が指定されていないため、MySQLはシーケンス番号を自動的に割り当てました。列にNULLまたは0を明示的に割り当てて、シーケンス番号を生成することもできます。


3

ここでは、完全に混乱させることなくテーブルに挿入するのに役立つ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'
);

2番目のアプローチ(警告が表示されますが、'' {単純な引用符/アポストロフィ}を指定します):

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

3番目のアプローチ(デフォルトの供給):

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

テーブルの作成時に定義したのと同じ順序ですべての値を含める限り、これらの例のいずれかをそのテーブルに挿入するときに十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.