Struct OnConflict
pub struct OnConflict { /* private fields */ }Implementations§
§impl OnConflict
impl OnConflict
pub fn new() -> Self
pub fn new() -> Self
Create a ON CONFLICT expression without target column, a special method designed for MySQL
pub 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
pub fn constraint(constraint: &str) -> Self
pub fn constraint(constraint: &str) -> Self
Set ON CONSTRAINT target constraint name
pub fn expr<T>(&mut self, expr: T) -> &mut Self
pub fn expr<T>(&mut self, expr: T) -> &mut Self
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(MsSqlQueryBuilder),
[
r#"INSERT INTO [glyph] ([aspect], [image])"#,
r#"VALUES ('abcd', 3.1415)"#,
]
.join(" ")
);
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(" ")
);pub 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
pub 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(" ")
);pub 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(" ")
);pub 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(MsSqlQueryBuilder),
[
r#"INSERT INTO [glyph] ([aspect], [image])"#,
r#"VALUES ('abcd', 3.1415)"#,
]
.join(" ")
);
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(" ")
);pub 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(MsSqlQueryBuilder),
r#"INSERT INTO [glyph] ([aspect], [image]) VALUES (2, 3)"#
);
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""#
);pub 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. Append to current list of expressions.
§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)
.values([(Glyph::Image, Expr::val(1).add(2))])
.to_owned()
)
.to_owned();
assert_eq!(
query.to_string(MsSqlQueryBuilder),
r#"INSERT INTO [glyph] ([aspect], [image]) VALUES (2, 3)"#
);
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"#
);pub fn value<C, T>(&mut self, col: C, value: T) -> &mut Self
pub fn value<C, T>(&mut self, col: C, value: T) -> &mut Self
Set ON CONFLICT update value
pub fn target_and_where(&mut self, other: Expr) -> &mut Self
pub fn target_and_where(&mut self, other: Expr) -> &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(MsSqlQueryBuilder),
r#"INSERT INTO [glyph] ([aspect], [image]) VALUES (2, 3)"#
);
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"#
);pub fn target_and_where_option(&mut self, other: Option<Expr>) -> &mut Self
pub fn target_and_where_option(&mut self, other: Option<Expr>) -> &mut Self
Set target WHERE
pub 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
pub fn action_and_where(&mut self, other: Expr) -> &mut Self
pub fn action_and_where(&mut self, other: Expr) -> &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(MsSqlQueryBuilder),
r#"INSERT INTO [glyph] ([aspect], [image]) VALUES (2, 3)"#
);
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"#
);pub fn action_and_where_option(&mut self, other: Option<Expr>) -> &mut Self
pub fn action_and_where_option(&mut self, other: Option<Expr>) -> &mut Self
Set action WHERE
pub 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§
§impl Clone for OnConflict
impl Clone for OnConflict
§fn clone(&self) -> OnConflict
fn clone(&self) -> OnConflict
Returns a duplicate 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 more§impl Debug for OnConflict
impl Debug for OnConflict
§impl Default for OnConflict
impl Default for OnConflict
§fn default() -> OnConflict
fn default() -> OnConflict
Returns the “default value” for a type. Read more
§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