mysql 操作總結 INSERT和REPLACE。本站提示廣大學習愛好者:(mysql 操作總結 INSERT和REPLACE)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql 操作總結 INSERT和REPLACE正文
弦外之音,就是對數據停止修正。在尺度的SQL中有3個語句,它們是INSERT、UPDATE和DELETE。在MySQL中又多了一個REPLACE語句,是以,本文以MySQL為配景來評論辯論若何使有SQL中的更新語句。
1、INSERT和REPLACE
INSERT和REPLACE語句的功效都是向表中拔出新的數據。這兩條語句的語法相似。它們的重要差別是若何處置反復的數據。
1. INSERT的普通用法
MySQL中的INSERT語句和尺度的INSERT不太一樣,在尺度的SQL語句中,一次拔出一筆記錄的INSERT語句只要一種情勢。
INSERT INTO tablename(列名…) VALUES(列值);
而在MySQL中還有別的一種情勢。
INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;
第一種辦法將列名和列值離開了,在應用時,列名必需和列值的數分歧。以下面的語句向users表中拔出了一筆記錄:
INSERT INTO users(id, name, age) VALUES(123, '姚明', 25);
第二種辦法許可列名和列值成對湧現和應用,以下面的語句將發生中樣的後果。
INSERT INTO users SET id = 123, name = '姚明', age = 25;
假如應用了SET方法,必需至多為一列賦值。假如某一個字段應用了省缺值(如默許或自增值),這兩種辦法都可以省略這些字段。如id字段上應用了自增值,下面兩條語句可以寫成以下情勢:
INSERT INTO users (name, age) VALUES('姚明',25);
INSERT INTO uses SET name = '姚明', age = 25;
MySQL在VALUES上也做了些變更。假如VALUES中甚麼都不寫,那MySQL將應用表中每列的默許值來拔出新記載。
INSERT INTO users () VALUES();
假如表名後甚麼都不寫,就表現向表中一切的字段賦值。應用這類方法,不只在VALUES中的值要和列數分歧,並且次序不克不及倒置。 INSERT INTO users VALUES(123, '姚明', 25);
假如將INSERT語句寫成以下情勢MySQL將會報錯。
INSERT INTO users VALUES('姚明',25);
2. 應用INSERT拔出多筆記錄
看到這個題目或許年夜家會問,這有甚麼好說的,挪用屢次INSERT語句不便可以拔出多筆記錄了嗎!但應用這類辦法要增長辦事器的負荷,由於,履行每次SQL辦事器都要異樣對SQL停止剖析、優化等操作。幸虧MySQL供給了另外一種處理計劃,就是應用一條INSERT語句來拔出多筆記錄。這其實不是尺度的SQL語法,是以只能在MySQL中應用。
INSERT INTO users(name, age) VALUES('姚明', 25), ('比爾.蓋茨', 50), ('火星人', 600);
下面的INSERT 語句向users表中持續拔出了3筆記錄。值得留意的是,下面的INSERT語句中的VALUES後必需每筆記錄的值放到一對(…)中,中央應用","朋分。假定有一個表table1
CREATE TABLE table1(n INT);
假如要向table1中拔出5筆記錄,上面寫法是毛病的:
INSERT INTO table1 (i) VALUES(1,2,3,4,5);
MySQL將會拋出上面的毛病
ERROR 1136: Column count doesn't match value count at row 1
而准確的寫法應當是如許:
INSERT INTO table1(i) VALUES(1),(2),(3),(4),(5);
固然,這類寫法也能夠省略列名,如許每對括號裡的值的數量必需分歧,並且這個數量必需和列數分歧。如:
INSERT INTO table1 VALUES(1),(2),(3),(4),(5);
3. REPLACE語句
我們在應用數據庫時能夠會常常碰到這類情形。假如一個表在一個字段上樹立了獨一索引,當我們再向這個表中應用曾經存在的鍵值拔出一筆記錄,那將會拋出一個主鍵抵觸的毛病。固然,我們能夠想用新記載的值來籠罩本來的記載值。假如應用傳統的做法,必需先應用 DELETE語句刪除本來的記載,然後再應用INSERT拔出新的記載。而在MySQL中為我們供給了一種新的處理計劃,這就是REPLACE語句。應用 REPLACE拔出一筆記錄時,假如不反復,REPLACE就和INSERT的功效一樣,假如有反復記載,REPLACE就應用新記載的值來調換本來的記載值。
應用REPLACE的最年夜利益就是可以將DELETE和INSERT合二為一,構成一個原子操作。如許便可以不用斟酌在同時應用DELETE和INSERT時添加事務等龐雜操作了。
在應用REPLACE時,表中必需有獨一索引,並且這個索引地點的字段不克不及許可空值,不然REPLACE就和INSERT完整一樣的。
在履行REPLACE後,體系前往了所影響的行數,假如前往1,解釋在表中並沒有反復的記載,假如前往2,解釋有一條反復記載,體系主動先挪用了 DELETE刪除這筆記錄,然後再記載用INSERT來拔出這筆記錄。假如前往的值年夜於2,那解釋有多個獨一索引,有多筆記錄被刪除和拔出。
REPLACE的語法和INSERT異常的類似,以下面的REPLACE語句是拔出或更新一筆記錄。
REPLACE INTO users (id,name,age) VALUES(123, '趙本山', 50);
拔出多筆記錄:
REPLACE INTO users(id, name, age) VALUES(123, '趙本山', 50), (134,'Mary',15);
REPLACE也能夠應用SET語句
REPLACE INTO users SET id = 123, name = '趙本山', age = 50;
下面曾提到REPLACE能夠影響3條以上的記載,這是由於在表中有跨越一個的獨一索引。在這類情形下,REPLACE將斟酌每個獨一索引,並對每個索引對應的反復記載都刪除,然後拔出這條新記載。假定有一個table1表,有3個字段a, b, c。它們都有一個獨一索引。
CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);
假定table1中曾經有了3筆記錄
a b c
1 1 1
2 2 2
3 3 3
上面我們應用REPLACE語句向table1中拔出一筆記錄。
REPLACE INTO table1(a, b, c) VALUES(1,2,3);
前往的成果以下
Query OK, 4 rows affected (0.00 sec)
在table1中的記載以下
a b c
1 2 3
我們可以看到,REPLACE將本來的3筆記錄都刪除,然後將(1, 2, 3)拔出