插入或替換
如果希望插入一條新記錄(INSERT),但如果記錄已經存在,就先刪除原記錄,再插入新記錄。此時,可以使用REPLACE
語句,這樣就不必先查詢,再決定是否先刪除再插入:
REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
若id=1
的記錄不存在,REPLACE
語句將插入新記錄,否則,當前id=1
的記錄將被刪除,然後再插入新記錄。
插入或更新
如果我們希望插入一條新記錄(INSERT),但如果記錄已經存在,就更新該記錄,此時,可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...
語句:
INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;
若id=1
的記錄不存在,INSERT
語句將插入新記錄,否則,當前id=1
的記錄將被更新,更新的字段由UPDATE
指定。
插入或忽略
如果我們希望插入一條新記錄(INSERT),但如果記錄已經存在,就啥事也不幹直接忽略,此時,可以使用INSERT IGNORE INTO ...
語句:
INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
若id=1
的記錄不存在,INSERT
語句將插入新記錄,否則,不執行任何操作。
快照
如果想要對一個表進行快照,即複製一份當前表的數據到一個新表,可以結合CREATE TABLE
和SELECT
:
CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;
新創建的表結構和SELECT
使用的表結構完全一致。
寫入查詢結果集
如果查詢結果集需要寫入到表中,可以結合INSERT
和SELECT
,將SELECT
語句的結果集直接插入到指定表中。
例如,創建一個統計成績的表statistics
,記錄各班的平均成績:
CREATE TABLE statistics (
id BIGINT NOT NULL AUTO_INCREMENT,
class_id BIGINT NOT NULL,
average DOUBLE NOT NULL,
PRIMARY KEY (id)
);
然後,我們就可以用一條語句寫入各班的平均成績:
INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;