pub struct OnConflict { /* private fields */ }
Implementations§
source§impl OnConflict
impl OnConflict
sourcepub fn new() -> Self
pub fn new() -> Self
Create a ON CONFLICT expression without target column, a special method designed for MySQL
sourcepub fn columns<I, C>(columns: I) -> Selfwhere
C: IntoIden,
I: IntoIterator<Item = C>,
pub fn columns<I, C>(columns: I) -> Selfwhere
C: IntoIden,
I: IntoIterator<Item = C>,
Set ON CONFLICT target columns
sourcepub fn expr<T>(&mut self, expr: T) -> &mut Selfwhere
T: Into<SimpleExpr>,
pub fn expr<T>(&mut self, expr: T) -> &mut Selfwhere
T: Into<SimpleExpr>,
Set ON CONFLICT target expression
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic(["abcd".into(), 3.1415.into()])
.on_conflict(
OnConflict::new()
.expr(Expr::col(Glyph::Id))
.update_column(Glyph::Aspect)
.value(Glyph::Image, Expr::val(1).add(2))
.to_owned(),
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
[
r#"INSERT INTO `glyph` (`aspect`, `image`)"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON DUPLICATE KEY UPDATE `aspect` = VALUES(`aspect`), `image` = 1 + 2"#,
]
.join(" ")
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id") DO UPDATE SET "aspect" = "excluded"."aspect", "image" = 1 + 2"#,
]
.join(" ")
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id") DO UPDATE SET "aspect" = "excluded"."aspect", "image" = 1 + 2"#,
]
.join(" ")
);
sourcepub fn exprs<I, T>(&mut self, exprs: I) -> &mut Self
pub fn exprs<I, T>(&mut self, exprs: I) -> &mut Self
Set multiple target expressions for ON CONFLICT. See OnConflict::expr
sourcepub fn do_nothing(&mut self) -> &mut Self
pub fn do_nothing(&mut self) -> &mut Self
Set ON CONFLICT do nothing.
Please use Self::do_nothing_on()
and provide primary keys if you are using MySQL.
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic(["abcd".into(), 3.1415.into()])
.on_conflict(
OnConflict::columns([Glyph::Id, Glyph::Aspect])
.do_nothing()
.to_owned(),
)
.to_owned();
// Sadly this is not valid today.
assert_eq!(
query.to_string(MysqlQueryBuilder),
[
r#"INSERT INTO `glyph` (`aspect`, `image`)"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON DUPLICATE KEY IGNORE"#,
]
.join(" ")
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id", "aspect") DO NOTHING"#,
]
.join(" ")
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id", "aspect") DO NOTHING"#,
]
.join(" ")
);
sourcepub fn do_nothing_on<C, I>(&mut self, pk_cols: I) -> &mut Selfwhere
C: IntoIden,
I: IntoIterator<Item = C>,
pub fn do_nothing_on<C, I>(&mut self, pk_cols: I) -> &mut Selfwhere
C: IntoIden,
I: IntoIterator<Item = C>,
Set ON CONFLICT do nothing, but with MySQL specific polyfill.
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic(["abcd".into(), 3.1415.into()])
.on_conflict(
OnConflict::columns([Glyph::Id, Glyph::Aspect])
.do_nothing_on([Glyph::Id])
.to_owned(),
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
[
r#"INSERT INTO `glyph` (`aspect`, `image`)"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON DUPLICATE KEY UPDATE `id` = `id`"#,
]
.join(" ")
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id", "aspect") DO NOTHING"#,
]
.join(" ")
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id", "aspect") DO NOTHING"#,
]
.join(" ")
);
sourcepub fn update_column<C>(&mut self, column: C) -> &mut Selfwhere
C: IntoIden,
pub fn update_column<C>(&mut self, column: C) -> &mut Selfwhere
C: IntoIden,
Set ON CONFLICT update column
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic([
"abcd".into(),
3.1415.into(),
])
.on_conflict(
OnConflict::columns([Glyph::Id, Glyph::Aspect])
.update_column(Glyph::Aspect)
.value(Glyph::Image, Expr::val(1).add(2))
.to_owned()
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
[
r#"INSERT INTO `glyph` (`aspect`, `image`)"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON DUPLICATE KEY UPDATE `aspect` = VALUES(`aspect`), `image` = 1 + 2"#,
]
.join(" ")
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id", "aspect") DO UPDATE SET "aspect" = "excluded"."aspect", "image" = 1 + 2"#,
]
.join(" ")
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
[
r#"INSERT INTO "glyph" ("aspect", "image")"#,
r#"VALUES ('abcd', 3.1415)"#,
r#"ON CONFLICT ("id", "aspect") DO UPDATE SET "aspect" = "excluded"."aspect", "image" = 1 + 2"#,
]
.join(" ")
);
sourcepub fn update_columns<C, I>(&mut self, columns: I) -> &mut Selfwhere
C: IntoIden,
I: IntoIterator<Item = C>,
pub fn update_columns<C, I>(&mut self, columns: I) -> &mut Selfwhere
C: IntoIden,
I: IntoIterator<Item = C>,
Set ON CONFLICT update columns
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic([
2.into(),
3.into(),
])
.on_conflict(
OnConflict::column(Glyph::Id)
.update_columns([Glyph::Aspect, Glyph::Image])
.to_owned(),
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"INSERT INTO `glyph` (`aspect`, `image`) VALUES (2, 3) ON DUPLICATE KEY UPDATE `aspect` = VALUES(`aspect`), `image` = VALUES(`image`)"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") DO UPDATE SET "aspect" = "excluded"."aspect", "image" = "excluded"."image""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") DO UPDATE SET "aspect" = "excluded"."aspect", "image" = "excluded"."image""#
);
sourcepub fn values<C, I>(&mut self, values: I) -> &mut Self
pub fn values<C, I>(&mut self, values: I) -> &mut Self
Set ON CONFLICT update exprs
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic([
2.into(),
3.into(),
])
.on_conflict(
OnConflict::column(Glyph::Id)
.value(Glyph::Image, Expr::val(1).add(2))
.to_owned()
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"INSERT INTO `glyph` (`aspect`, `image`) VALUES (2, 3) ON DUPLICATE KEY UPDATE `image` = 1 + 2"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") DO UPDATE SET "image" = 1 + 2"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") DO UPDATE SET "image" = 1 + 2"#
);
sourcepub fn target_and_where(&mut self, other: SimpleExpr) -> &mut Self
pub fn target_and_where(&mut self, other: SimpleExpr) -> &mut Self
Set target WHERE
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic([
2.into(),
3.into(),
])
.on_conflict(
OnConflict::column(Glyph::Id)
.value(Glyph::Image, Expr::val(1).add(2))
.target_and_where(Expr::col((Glyph::Table, Glyph::Aspect)).is_null())
.to_owned()
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"INSERT INTO `glyph` (`aspect`, `image`) VALUES (2, 3) ON DUPLICATE KEY UPDATE `image` = 1 + 2"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") WHERE "glyph"."aspect" IS NULL DO UPDATE SET "image" = 1 + 2"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") WHERE "glyph"."aspect" IS NULL DO UPDATE SET "image" = 1 + 2"#
);
sourcepub fn target_and_where_option(
&mut self,
other: Option<SimpleExpr>,
) -> &mut Self
pub fn target_and_where_option( &mut self, other: Option<SimpleExpr>, ) -> &mut Self
Set target WHERE
sourcepub fn target_cond_where<C>(&mut self, condition: C) -> &mut Selfwhere
C: IntoCondition,
pub fn target_cond_where<C>(&mut self, condition: C) -> &mut Selfwhere
C: IntoCondition,
Set target WHERE
sourcepub fn action_and_where(&mut self, other: SimpleExpr) -> &mut Self
pub fn action_and_where(&mut self, other: SimpleExpr) -> &mut Self
Set action WHERE
§Examples
use sea_query::{tests_cfg::*, *};
let query = Query::insert()
.into_table(Glyph::Table)
.columns([Glyph::Aspect, Glyph::Image])
.values_panic([
2.into(),
3.into(),
])
.on_conflict(
OnConflict::column(Glyph::Id)
.value(Glyph::Image, Expr::val(1).add(2))
.action_and_where(Expr::col((Glyph::Table, Glyph::Aspect)).is_null())
.to_owned()
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"INSERT INTO `glyph` (`aspect`, `image`) VALUES (2, 3) ON DUPLICATE KEY UPDATE `image` = 1 + 2"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") DO UPDATE SET "image" = 1 + 2 WHERE "glyph"."aspect" IS NULL"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"INSERT INTO "glyph" ("aspect", "image") VALUES (2, 3) ON CONFLICT ("id") DO UPDATE SET "image" = 1 + 2 WHERE "glyph"."aspect" IS NULL"#
);
sourcepub fn action_and_where_option(
&mut self,
other: Option<SimpleExpr>,
) -> &mut Self
pub fn action_and_where_option( &mut self, other: Option<SimpleExpr>, ) -> &mut Self
Set action WHERE
sourcepub fn action_cond_where<C>(&mut self, condition: C) -> &mut Selfwhere
C: IntoCondition,
pub fn action_cond_where<C>(&mut self, condition: C) -> &mut Selfwhere
C: IntoCondition,
Set action WHERE
Trait Implementations§
source§impl Clone for OnConflict
impl Clone for OnConflict
source§fn clone(&self) -> OnConflict
fn clone(&self) -> OnConflict
Returns a copy of the value. Read more
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moresource§impl Debug for OnConflict
impl Debug for OnConflict
source§impl Default for OnConflict
impl Default for OnConflict
source§fn default() -> OnConflict
fn default() -> OnConflict
Returns the “default value” for a type. Read more
source§impl PartialEq for OnConflict
impl PartialEq for OnConflict
impl StructuralPartialEq for OnConflict
Auto Trait Implementations§
impl Freeze for OnConflict
impl !RefUnwindSafe for OnConflict
impl Send for OnConflict
impl Sync for OnConflict
impl Unpin for OnConflict
impl !UnwindSafe for OnConflict
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (
clone_to_uninit
)