MySQL數據庫INSERT、UPDATE、DELETE和REPLACE語句的用法詳解。本站提示廣大學習愛好者:(MySQL數據庫INSERT、UPDATE、DELETE和REPLACE語句的用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL數據庫INSERT、UPDATE、DELETE和REPLACE語句的用法詳解正文
MySQL數據庫insert和update語句
引:用於操作數據庫的SQL普通分為兩種,一種是查詢語句,也就是我們所說的SELECT語句,別的一種就是更新語句,也叫做數據操作語句。弦外之音,就是對數據停止修正。在尺度的SQL中有3個語句,它們是INSERT、UPDATE和DELETE。
用於操作數據庫的SQL普通分為兩種,一種是查詢語句,也就是我們所說的SELECT語句,別的一種就是更新語句,也叫做數據操作語句。弦外之音,就 是對數據停止修正。在尺度的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 t able1(i) VALUES(1),(2),(3),(4),(5);
固然,這類寫法也能夠省略列名,如許每對括號裡的值的數量必需分歧,並且這個數量必需和列數分歧。如:
INSERT INTO t able1 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)拔出。
2、UPDATE
UPDATE的功效是更新表中的數據。這的語法和INSERT的第二種用法類似。必需供給表名和SET表達式,在前面可以加WHERE以限制更新的記載規模。
UPDATE table_anem SET column_name1 = value1, column_name2 = value2, ...
WHERE ... ;
以下面的語句將users表中id等於123的記載的age改成24
UPDATE users SET age = 24 WHERE id = 123;
異樣,可使用UPDATE更新多個字段的值 UPDATE users SET age = 24, name = 'Mike' WHERE id = 123;
下面的UPDATE語句經由過程WHERE指定一個前提,不然,UPDATE將更新表中的一切記載的值。
在應用UPDATE更新記載時,假如被更新的字段的類型和所賦的值不婚配時,MySQL將這個值轉換為響應類型的值。假如這個字段是數值類型,並且所賦 值跨越了這個數據類型的最年夜規模,那末MySQL就將這個值轉換為這個規模最年夜或最小值。假如字符串太長,MySQL就將過剩的字符串截去。假如設置非空 字段為空,那末將這個字段設置為它們的默許值,數字的默許值是0,字符串的默許值是空串(不是null,是"")。
有兩種情形UPDATE不會對影響表中的數據。
1. 當WHERE中的前提在表中沒有記載和它婚配時。
2. 當我們將異樣的值賦給某個字段時,如將字段abc賦為'123',而abc的原值就是'123'。
和INSERT、REPLACE一樣,UPDATE也前往所更新的記載數。但這些記載數其實不包含知足WHERE前提的,但卻未被更新的記載。以下同的UPDATE語句就未更新任何記載。
UPDATE users SET age = 30 WHERE id = 12;
Query OK, 0 rows affected (0.00 sec)
須要留意的時,假如一個字段的類型是TIMESTAMP,那末這個字段在其它字段更新時主動更新。
在有些時刻我們須要獲得UPDATE所選擇的行數,而不是被更新的行數。我們可以經由過程一些API來到達這個目標。如MySQL供給的C API供給了一個選項可以獲得你想要的記載數。而MySQL的JDBC驅動獲得的默許記載數也是婚配的記載數。
UPDATE和REPLACE根本相似,然則它們之間有兩點分歧。
1. UPDATE在沒有婚配記載時甚麼都不做,而REPLACE在有反復記載時更新,在沒有反復記載時拔出。
2. UPDATE可以選擇性地更新記載的一部門字段。而REPLACE在發明有反復記載時就將這筆記錄完全刪除,再拔出新的記載。也就是說,將一切的字段都更新了。
3、DELETE和TRUNCATE TABLE
在MySQL中有兩種辦法可以刪除數據,一種是DELETE語句,另外一種是TRUNCATE TABLE語句。DELETE語句可以經由過程WHERE對要刪除的記載停止選擇。而應用TRUNCATE TABLE將刪除表中的一切記載。是以,DELETE語句更靈巧。
假如要清空表中的一切記載,可使用上面的兩種辦法:
DELETE FROM table1
TRUNCATE TABLE table1
個中第二筆記錄中的TABLE是可選的。
假如要刪除表中的部門記載,只能應用DELETE語句。
DELETE FROM table1 WHERE ...;
假如DELETE不加WHERE子句,那末它和TRUNCATE TABLE是一樣的,但它們有一點分歧,那就是DELETE可以前往被刪除的記載數,而TRUNCATE TABLE前往的是0。
假如一個表中有自增字段,應用TRUNCATE TABLE和沒有WHERE子句的DELETE刪除一切記載後,這個自增字段將肇端值恢復成1.假如你不想如許做的話,可以在DELETE語句中加上永真的WHERE,如WHERE 1或WHERE true。
DELETE FROM table1 WHERE 1;
下面的語句在履行時將掃描每筆記錄。但它其實不比擬,由於這個WHERE前提永久為true。如許做固然可以堅持自增的最年夜值,但因為它是掃描了一切的記載,是以,它的履行本錢要比沒有WHERE子句的DELETE年夜很多。
DELETE和TRUNCATE TABLE的最年夜差別是DELETE可以經由過程WHERE語句選摘要刪除的記載。但履行得速度不快。並且還可以前往被刪除的記載數。而TRUNCATE TABLE沒法刪除指定的記載,並且不克不及前往被刪除的記載。但它履行得異常快。
和尺度的SQL語句分歧,DELETE支撐ORDER BY和LIMIT子句,經由過程這兩個子句,我們可以更好地掌握要刪除的記載。如當我們只想刪除WHERE子句過濾出來的記載的一部門,可使用LIMIB, 假如要刪除後幾筆記錄,可以經由過程ORDER BY和LIMIT合營應用。假定我們要刪除users表中name等於"Mike"的前6筆記錄。可使用以下的DELETE語句:
DELETE FROM users WHERE name = 'Mike' LIMIT 6;
普通MySQL其實不肯定刪除的這6筆記錄是哪6條,為了更保險,我們可使用ORDER BY對記載停止排序。
DELETE FROM users WHERE name = 'Mike' ORDER BY id DESC LIMIT 6