ホームページ  >  記事  >  データベース  >  mysql での挿入操作を解析する

mysql での挿入操作を解析する

怪我咯
怪我咯オリジナル
2017-04-01 10:03:281361ブラウズ

insert の構文

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

    [INTO] tbl_name [(col_name,...)]

    VALUES ({expr | DEFAULT},...),(...),...

    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

或:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

    [INTO] tbl_name

    SET col_name={expr | DEFAULT}, ...

    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

或:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

    [INTO] tbl_name [(col_name,...)]

    SELECT ...

    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

列リストと VALUES リストが両方とも空のリストの場合、INSERT は各列がデフォルト値に設定された行を作成します:

INSERT INTO tbl_name () VALUES();

ワーカー テーブルには名前とメールアドレス、データを挿入

insert into worker values(“tom”,”tom@yahoo.com”);

複数のデータを一括で挿入

insert into worker values(‘tom','tom@yahoo.com'),(‘paul','paul@yahoo.com');

値を割り当てる列を与え、その値をリストするデータを挿入

insert into worker (name) values (‘tom');

insert into worker (name) values (‘tom'), (‘paul');

セットを使用するデータを挿入するには

insert into worker set name='tom';

SET 句内の名前のない行にはデフォルト値が割り当てられます。この形式の INSERT ステートメントを使用して複数の行を挿入することはできません。
式では、値テーブルに以前に設定された列を 参照できます。例:

INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

--但不能这样

INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

INSERT...SELECT ステートメントを使用して、他のテーブルから選択した行を挿入します

insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;

--如果每一列都有数据

insert into tbl_name1 select col3,col4 from tbl_name2;

クエリには ORDER BY 句を含めることはできません、および INSERT ステートメントの宛先テーブルは FROM 句.
ON DUPLICATE KEY UPDATE
を SELECT クエリ部分に指定すると、行を挿入すると UNIQUE になります。 Index または PRIMARY KEY 重複した値が発生した場合は、古い行に対して UPDATE を実行します。

--假设a,b为唯一索引,表table没有1,2这样的行是正常插入数据,冲突时,更新c列的值

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3;

--或者是

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=values(c);

--引用其他列更新冲突的行

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

 向一个已定义为NOT NULL的列中插入NULL。对于一个多行INSERT语句或INSERT INTO...SELECT语句,根据列数据的类型,列被设置为隐含的默认值。对于数字类型,默认值为0;对于字符串类型,默认值为空字符串('');对于日期和时间类型,默认值为“zero”值。

INSERT INTO...SELECT ON DUPLICATE KEY UPDATE

insert into tbl_name1(a,b,c) 

  select col1,col2,col3 from tbl_name2 

ON DUPLICATE KEY UPDATE c=values(c);

INSERT DELAYED
クライアントがINSERTの完了を待てない場合、クライアントがWhen INSERT DELAYEDを使用する場合、このオプションは非常に便利です。入力すると、サーバーからすぐに確認が得られます。そして、行は queue にエンキューされ、テーブルが 他の スレッドによって使用されていないときに、行が挿入されます。 INSERT DELAYED を使用するもう 1 つの重要な利点は、多くのクライアントからの挿入が一緒にプールされ、1 つのブロックに書き込まれることです。これは、多数の独立した挿入を実行するよりもはるかに高速です。

INSERT DELAYED INTO worker (name) values (‘tom'), (‘paul');

DELAYED を使用する場合、いくつかの制限があります:

1.INSERT DELAYED は、MyISAM、MEMORY、および ARCHIVE テーブルでのみ使用できます。 MyISAM テーブルの場合、データ ファイルの途中に空きブロックがない場合、SELECT ステートメントと INSERT ステートメントの両方がサポートされます。このような場合、基本的に MyISAM で INSERT DELAYED を使用する必要はありません。

2.INSERT DELAYED は、値のリストを指定する INSERT ステートメントにのみ使用してください。サーバーは、INSERT DELAYED...SELECT ステートメントの DELAYED および INSERT DELAYED...ON DUPLICATE UPDATE ステートメントの DELAYED を無視します。

3. ステートメントは行が挿入される直前に戻るため、LAST_INSERT_ID() を使用して AUTO_INCREMENT 値を取得することはできません。 AUTO_INCREMENT 値はステートメントによって生成される場合があります。

4. SELECT ステートメントの場合、DELAYED 行は実際に挿入されるまで表示されません。

5.DELAYED は、スレーブ レプリケーション サーバーでは無視されます。DELAYED は、マスター サーバーとは異なるデータをスレーブ サーバーに生成しないためです。

以上がmysql での挿入操作を解析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。