pub struct InsertStatement {
pub ctes: Vec<Cte>,
pub table: String,
pub alias: Option<String>,
pub columns: Option<Vec<String>>,
pub rows: Vec<Vec<Expr>>,
pub select_source: Option<Box<SelectStatement>>,
pub on_conflict: Option<OnConflictClause>,
pub returning: Option<Vec<SelectItem>>,
pub overriding: Overriding,
pub mysql_ignore: bool,
}Fields§
§ctes: Vec<Cte>v7.37.43-T4.4 — leading WITH cte AS (…) clauses on a top-
level INSERT (writable CTE outer body). Empty for a plain
INSERT. PG semantics: each CTE materialises before the
outer INSERT runs, sharing the same transaction.
table: String§alias: Option<String>v7.39 (round 240) — INSERT INTO t AS alias: the alias the ON
CONFLICT DO UPDATE expressions (and RETURNING) refer to the target
row by. PG requires the AS keyword in this position.
columns: Option<Vec<String>>Optional column list — INSERT INTO t (a, b) VALUES (...). When
None, every tuple is positional and must match the table arity.
When Some, the engine maps each tuple slot to the named column and
fills the rest with NULL (must be nullable).
rows: Vec<Vec<Expr>>One or more (expr, expr, ...) tuples — the multi-row VALUES form.
v1.3+ accepts INSERT INTO t VALUES (a), (b). Empty when
select_source is Some (the engine builds rows from the
inner SELECT result set instead).
select_source: Option<Box<SelectStatement>>v7.13.0 — INSERT INTO t [(cols)] SELECT … (mailrs
round-5 G4). When present, rows is empty and the engine
materialises the SELECT result, coerces each output tuple to
the target column types, and inserts as a single batch.
on_conflict: Option<OnConflictClause>v7.9.7 — ON CONFLICT (cols) DO { NOTHING | UPDATE SET … }
upsert clause. None = legacy INSERT (conflict raises a
DuplicateKey error). mailrs migration blocker #2.
returning: Option<Vec<SelectItem>>v7.9.4 — RETURNING <projection>.
overriding: Overridingv7.38 (read01) — OVERRIDING { SYSTEM | USER } VALUE clause
between the column list and VALUES. Governs how explicitly-supplied
values interact with GENERATED … AS IDENTITY columns:
None— default. AGENERATED ALWAYSidentity column rejects an explicit non-DEFAULT value; aBY DEFAULTone accepts it.System— override the ALWAYS restriction: the explicit value is used verbatim, as for aBY DEFAULTcolumn.User— ignore any explicit value on aBY DEFAULTidentity column and generate from the sequence instead (no effect on non-identity columns).
mysql_ignore: boolv7.39 (round 434) — the statement was spelled INSERT IGNORE.
Round 406 lowered that to ON CONFLICT DO NOTHING, which covers the
key-conflict half of MySQL’s IGNORE. The other half is that IGNORE
also downgrades per-VALUE errors to coercions (out-of-range clamps,
over-long strings truncate, a non-numeric string becomes 0, a NULL
into a NOT NULL column becomes the type’s default), and the engine
cannot recover that intent from the conflict clause alone. A plain
bool lands in this struct’s existing padding, so the AST does not
grow — measured, per the round-305 / 413 nesting-stack lesson.
Trait Implementations§
Source§impl Clone for InsertStatement
impl Clone for InsertStatement
Source§fn clone(&self) -> InsertStatement
fn clone(&self) -> InsertStatement
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more