Heim  >  Artikel  >  Datenbank  >  Analysieren Sie den Einfügevorgang in MySQL

Analysieren Sie den Einfügevorgang in MySQL

怪我咯
怪我咯Original
2017-04-01 10:03:281408Durchsuche

Syntax des Einfügens

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, ... ]

Wenn sowohl die Spaltenliste als auch die VALUES-Liste leere Listen sind, erstellt INSERT jeweils eine Zeile Die Spalten werden auf Standardwerte gesetzt:

INSERT INTO tbl_name () VALUES();

Unter der Annahme, dass die Worker-Tabelle nur den Namen und die E-Mail-Adresse enthält, fügen Sie ein Datenelement

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

in Stapeln Fügen Sie mehrere Datenelemente ein

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

Geben Sie der Spalte, der ein Wert zugewiesen werden soll, und listen Sie dann die Werte aufDaten einfügen

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

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

Set zum Einfügen von Daten verwenden

insert into worker set name='tom';

Unbenannten Zeilen in der SET-Klausel wird mit dieser Form der INSERT-Anweisung kein Standardwert zugewiesen.
Ein Ausdruck kann auf jede Spalte verweisen, die zuvor in einer Wertetabelle festgelegt wurde, zum Beispiel:

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

--但不能这样

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

Verwenden Sie die INSERT...SELECT-Anweisung, um ausgewählte Zeilen einzufügen andere Tabellen

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

--如果每一列都有数据

insert into tbl_name1 select col3,col4 from tbl_name2;

Die Abfrage darf keine ORDER BY-Klausel enthalten und die Zieltabelle der INSERT-Anweisung darf nicht in der FROM-Klausel des SELECT-Abfrageteils erscheinen.
ON DUPLICATE KEY UPDATE
Wenn Sie ON DUPLICATE KEY UPDATE angeben und das Einfügen einer Zeile zu einem doppelten Wert in einem UNIQUEIndex oder PRIMARY KEY führen würde, wird ein UPDATE des alte Zeile wird ausgeführt.

--假设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 IN...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
Diese Option ist nützlich, wenn Ihr Client nicht auf den Abschluss von INSERT warten kann. Wenn ein Client INSERT DELAYED verwendet, erhält er sofort ein OK vom Server. Und die Zeile wird in die Warteschlange eingereiht und die Zeile wird eingefügt, wenn die Tabelle nicht von anderen Threads verwendet wird.
Ein weiterer wichtiger Vorteil der Verwendung von INSERT DELAYED besteht darin, dass Einfügungen von vielen Clients zusammengefasst und in einen Block geschrieben werden. Dies ist viel schneller als die Durchführung vieler unabhängiger Einfügungen.

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

Bei der Verwendung von DELAYED gibt es einige Einschränkungen:
1.INSERT DELAYED ist nur für MyISAM-, MEMORY- und ARCHIVE-Tabellen verfügbar. Wenn bei MyISAM-Tabellen keine freien Blöcke in der Mitte der Datendatei vorhanden sind, werden sowohl SELECT- als auch INSERT-Anweisungen unterstützt. In diesen Fällen besteht grundsätzlich keine Notwendigkeit, INSERT DELAYED mit MyISAM zu verwenden.

2.INSERT DELAYED sollte nur für INSERT-Anweisungen verwendet werden, die eine Werteliste angeben. Der Server ignoriert DELAYED für INSERT DELAYED...SELECT-Anweisungen und DELAYED für INSERT DELAYED...ON DUPLICATE UPDATE-Anweisungen.

3. Da die Anweisung unmittelbar vor dem Einfügen der Zeile zurückkehrt, können Sie LAST_INSERT_ID() nicht verwenden, um den AUTO_INCREMENT-Wert zu erhalten. AUTO_INCREMENT-Werte können durch Anweisungen generiert werden.

4. Bei SELECT-Anweisungen sind VERZÖGERTE Zeilen erst sichtbar, wenn diese Zeilen tatsächlich eingefügt werden.

5.DELAYED wird auf dem Slave-Replikationsserver ignoriert, da DELAYED auf dem Slave-Server keine anderen Daten erzeugt als auf dem Master-Server.

Das obige ist der detaillierte Inhalt vonAnalysieren Sie den Einfügevorgang in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn