1. 概觀
insert-stmt
common-table-expression
expr
filter-clause
function-arguments
ordering-term
literal-value
over-clause
frame-spec
ordering-term
raise-function
type-name
signed-number
returning-clause
select-stmt
compound-operator
join-clause
join-constraint
join-operator
ordering-term
result-column
table-or-subquery
window-defn
frame-spec
upsert-clause
column-name-list
indexed-column
INSERT 敘述有三個基本形式。
INSERT INTO table VALUES(...);
第一個形式(使用「VALUES」關鍵字)會在現有表格中建立一個或多個新列。如果省略 table-name 之後的 column-name 清單,則插入每列的值數量必須與表格中的欄位數量相同。在此情況下,會將從 VALUES 清單中每個項目的最左邊運算式評估的結果插入每列新列的最左邊欄位,依此類推。如果指定 column-name 清單,則 VALUE 清單中每個項目的值數量必須與指定欄位的數量相符。新列的每個已命名欄位都會填入評估對應 VALUES 運算式的結果。未出現在欄位清單中的表格欄位會填入 預設欄位值(指定為 CREATE TABLE 陳述式的一部分),或在未指定 預設值 的情況下填入 NULL。
INSERT INTO table SELECT ...;
INSERT 陳述式的第二種形式包含 SELECT 陳述式,而非 VALUES 子句。對於 SELECT 陳述式執行的資料的每一列,都會在資料表中插入一筆新資料。如果指定了欄位清單,SELECT 結果中的欄位數目必須與欄位清單中的項目數目相同。否則,如果沒有指定欄位清單,SELECT 結果中的欄位數目必須與資料表中的欄位數目相同。任何 SELECT 陳述式,包括 複合 SELECT 和具有 ORDER BY 和/或 LIMIT 子句的 SELECT 陳述式,都可以在這種形式的 INSERT 陳述式中使用。
為了避免解析歧義,如果存在 upsert 子句,SELECT 陳述式應始終包含 WHERE 子句,即使該子句只是「WHERE true」。沒有 WHERE 子句,解析器不知道「ON」這個代碼是 SELECT 上的聯結約束的一部分,還是 upsert 子句 的開頭。
INSERT INTO table DEFAULT VALUES;
INSERT 陳述式的第三種形式是 DEFAULT VALUES。INSERT ... DEFAULT VALUES 陳述式會在指定的資料表中插入一列新資料。新資料的每一列都填入其 預設值,或者如果在 CREATE TABLE 陳述式的欄位定義中未指定預設值,則填入 NULL。DEFAULT VALUES 之後不支援 upsert 子句。
初始的「INSERT」關鍵字可以替換為「REPLACE」或「INSERT OR 動作」來指定在該 INSERT 命令期間使用的替代約束衝突解決演算法。為了與 MySQL 相容,剖析器允許使用單一關鍵字REPLACE作為「INSERT OR REPLACE」的別名。
在table-name上的選用「schema-name.」前置詞僅支援頂層 INSERT 陳述式。對於在CREATE TRIGGER陳述式中發生的 INSERT 陳述式,其表格名稱必須是不限定的。類似地,「DEFAULT VALUES」形式的 INSERT 陳述式僅支援頂層 INSERT 陳述式,而不支援觸發器中的 INSERT 陳述式。
選用的「AS alias」短語提供了一個替代名稱,用於將內容插入其中的表格。別名可以在UPSERT的 WHERE 和 SET 子句中使用。如果沒有upsert-clause,則alias是沒有意義的,但也是無害的。
請參閱單獨的UPSERT文件,以了解額外的尾隨語法,如果 INSERT 否則會違反唯一性約束,則可能會導致 INSERT 表現為 UPDATE。在「INSERT ... DEFAULT VALUES」上不允許使用upsert 子句。
此頁面最後修改於 2022-01-08 05:02:57 UTC