From dfb99d18225906d2ba373c99f4e280a35d5907ba Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 24 Aug 2023 23:56:28 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20MySql/Sqlite=20InsertO?= =?UTF-8?q?rUpdate=20+=20IfExistsDoNothing=20=E7=AE=80=E5=8C=96=20SQL=20in?= =?UTF-8?q?sert=20ignore=20into=EF=BC=9B#1601?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 6 ++-- .../MySql/Curd/CustomMySqlInsertOrUpdate.cs | 29 ++++++++++--------- .../Curd/MySqlInsertOrUpdate.cs | 29 ++++++++++--------- .../MySql/Curd/OdbcMySqlInsertOrUpdate.cs | 29 ++++++++++--------- .../Curd/SqliteInsertOrUpdate.cs | 29 ++++++++++--------- 5 files changed, 67 insertions(+), 55 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index d8a1c7d1..329b79a7 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -559,7 +559,7 @@ namespace base_entity //.UseConnectionString(FreeSql.DataType.Firebird, @"database=localhost:D:\fbdata\EXAMPLES.fdb;user=sysdba;password=123456;max pool size=5") //.UseQuoteSqlName(false) - //.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;min pool size=1;Max pool size=3;AllowLoadLocalInfile=true") + .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;min pool size=1;Max pool size=3;AllowLoadLocalInfile=true") //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") @@ -602,8 +602,8 @@ namespace base_entity var dict = new List>(); Dictionary d = new Dictionary(); - d.Add("id", 1); - d.Add("name", "name1"); + d.Add("id", 2); + d.Add("name", "name2"); dict.Add(d); var testx01 = fsql.InsertOrUpdateDict(dict).AsTable("table222zzz").WherePrimary("id").IfExistsDoNothing().ToSql(); fsql.InsertOrUpdateDict(dict).AsTable("table222zzz").WherePrimary("id").IfExistsDoNothing().ExecuteAffrows(); diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs index 3b257fc1..bc6f4dc7 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs @@ -87,19 +87,22 @@ namespace FreeSql.Custom.MySql else { if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.Entity_Must_Primary_Key("fsql.InsertOrUpdate + IfExistsDoNothing + MySql ", _table.CsName)); - sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => - { - sb.Append(" \r\n FROM dual WHERE NOT EXISTS("); - if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) - sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); - else - sb.Append( - _orm.Select() - .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) - .DisableGlobalFilter() - .WhereDynamic(rowd) - .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); - }); + sql = insert.ToSqlValuesOrSelectUnionAll(); + if (sql?.StartsWith("INSERT INTO ") == true) + sql = $"INSERT IGNORE INTO {sql.Substring(12)}"; + //sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => + //{ + // sb.Append(" \r\n FROM dual WHERE NOT EXISTS("); + // if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) + // sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); + // else + // sb.Append( + // _orm.Select() + // .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) + // .DisableGlobalFilter() + // .WhereDynamic(rowd) + // .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); + //}); } } if (string.IsNullOrEmpty(sql)) return null; diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs index f1bb84de..1a4a0c65 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs @@ -87,19 +87,22 @@ namespace FreeSql.MySql.Curd else { if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.Entity_Must_Primary_Key("fsql.InsertOrUpdate + IfExistsDoNothing + MySql ", _table.CsName)); - sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => - { - sb.Append(" \r\n FROM dual WHERE NOT EXISTS("); - if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) - sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); - else - sb.Append( - _orm.Select() - .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) - .DisableGlobalFilter() - .WhereDynamic(rowd) - .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); - }); + sql = insert.ToSqlValuesOrSelectUnionAll(); + if (sql?.StartsWith("INSERT INTO ") == true) + sql = $"INSERT IGNORE INTO {sql.Substring(12)}"; + //sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => + //{ + // sb.Append(" \r\n FROM dual WHERE NOT EXISTS("); + // if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) + // sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); + // else + // sb.Append( + // _orm.Select() + // .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) + // .DisableGlobalFilter() + // .WhereDynamic(rowd) + // .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); + //}); } } if (string.IsNullOrEmpty(sql)) return null; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs index 2ebea13e..f7bad9d6 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs @@ -87,19 +87,22 @@ namespace FreeSql.Odbc.MySql else { if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.Entity_Must_Primary_Key("fsql.InsertOrUpdate + IfExistsDoNothing + MySql ", _table.CsName)); - sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => - { - sb.Append(" \r\n FROM dual WHERE NOT EXISTS("); - if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) - sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); - else - sb.Append( - _orm.Select() - .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) - .DisableGlobalFilter() - .WhereDynamic(rowd) - .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); - }); + sql = insert.ToSqlValuesOrSelectUnionAll(); + if (sql?.StartsWith("INSERT INTO ") == true) + sql = $"INSERT IGNORE INTO {sql.Substring(12)}"; + //sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => + //{ + // sb.Append(" \r\n FROM dual WHERE NOT EXISTS("); + // if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) + // sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); + // else + // sb.Append( + // _orm.Select() + // .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) + // .DisableGlobalFilter() + // .WhereDynamic(rowd) + // .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); + //}); } } if (string.IsNullOrEmpty(sql)) return null; diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs index 857dd3a6..cb0824b4 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs @@ -59,23 +59,26 @@ namespace FreeSql.Sqlite.Curd if (_updateIgnore.Any()) throw new Exception(CoreStrings.S_InsertOrUpdate_Unable_UpdateColumns); sql = insert.ToSql(); if (sql?.StartsWith("INSERT INTO ") == true) - sql = $"REPLACE INTO {sql.Substring("INSERT INTO ".Length)}"; + sql = $"INSERT OR REPLACE INTO {sql.Substring(12)}"; } else { if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.Entity_Must_Primary_Key("fsql.InsertOrUpdate + IfExistsDoNothing + Sqlite ", _table.CsName)); - sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => { - sb.Append(" \r\n WHERE NOT EXISTS("); - if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) - sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); - else - sb.Append( - _orm.Select() - .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) - .DisableGlobalFilter() - .WhereDynamic(rowd) - .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); - }); + sql = insert.ToSql(); + if (sql?.StartsWith("INSERT INTO ") == true) + sql = $"INSERT OR IGNORE INTO {sql.Substring(12)}"; + //sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) => { + // sb.Append(" \r\n WHERE NOT EXISTS("); + // if (typeof(T1) == typeof(Dictionary) && rowd is T1 dict) + // sb.Append($"SELECT 1 FROM {_commonUtils.QuoteSqlName(_tableRule(null))} WHERE {_commonUtils.WhereItems(_tempPrimarys, "", new T1[] { dict })})"); + // else + // sb.Append( + // _orm.Select() + // .AsTable((_, __) => _tableRule?.Invoke(__)).AsType(_table.Type) + // .DisableGlobalFilter() + // .WhereDynamic(rowd) + // .Limit(1).ToSql("1").Replace(" \r\n", " \r\n ")).Append(")"); + //}); } } if (string.IsNullOrEmpty(sql)) return null;