1.MySQL对CREATE TABLE IF NOT EXISTS SELECT的处理 MySQL支持创建持数据表时判断是否存在,存在则不创建,不存在则创建,相应语句如下: --格式 CREATE...null primary key,name varchar(32) not null); MySQL官方对CREATE TABLE IF NOT EXISTS SELECT给出的解释是: CREATE...当数据表存在的时候,使用insert into select将select的结果插入到数据表中,当select的结果集的列数与数据表的列数不相匹配时,又分为两种情况: 第一种:select的结果列数m小于原数据表的列数...n,那么将select的结果插入到数据表的最有表,左边n-m列以默认值填充。...一个解决的办法就是先drop table,再执行CREATE TABLE IF NOT EXISTS SELECT。
上代码: (注:这是我封好的js主要看SQL语句) 1 select('SELECT * FROM Person WHERE NOT EXISTS(SELECT...相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询。...EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”。...然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。 Exists:若子查询的结果集非空时,返回“True”;若子查询的结果集为空时,返回“False” 。...NOT EXISTS :若子查询结果为空,返回“TRUE”值;若子查询的结果集非空时,返回 “FALSE。 嘿嘿嘿好理解多了吧!!!!!!!
in OR exists in 是把外表和内表做 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询,一直以来认为 exists 比 in 的效率高的说法是不准确的...如果两个表大小相当,则 in 和 exists 的效率是差不多的,如果两个表的一大一小,则子查询表大的用 exists,子查询表小的用 in。...} } 这里需要说明的是: exists(a[i].id) 的过程,实际上是去数据库中查询 b 表的过程。...in(select c2 from t2); 这个时候,我们可以看到,先查询出 t2.c2 的值(2,null), 也就是,我们把这个语句变成了 select * from t1 where t2 select * from t1 where not exists(select c2 from t2 where t2.c2 = t1.c2); 得到的结果是 c1 c2 1 3 OK,这就是我们想要的结果
如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in; 例如:表A(小表),表B(大表) select * from...A where cc in(select cc from B) -->效率低,用到了A表上cc列的索引; select * from A where exists(select cc from B...相反的: select * from B where cc in(select cc from A) -->效率高,用到了B表上cc列的索引 select * from B where exists...其他分析: 1.EXISTS的执行流程 select * from t1 where exists ( select null from t2 where y = x ) 可以理解为: for x...另外IN时不对NULL进行处理 如:select 1 from dual where null in (0,1,2,null) 为空 2.NOT IN 与NOT EXISTS: NOT EXISTS的执行流程
如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in; 例如:表A(小表),表B(大表) select * from... A where cc in(select cc from B) -->效率低,用到了A表上cc列的索引; select * from A where exists(select cc from B...相反的: select * from B where cc in(select cc from A) -->效率高,用到了B表上cc列的索引 select * from B where exists...EXISTS的执行流程 ---- select * from t1 where exists ( select null from t2 where y = x ) 可以理解为: for x in (...NOT IN 与NOT EXISTS ---- NOT EXISTS的执行流程 select ..... from rollup R where not exists ( select 'Found'
序 本文主要研究一下gorm的logger OIP - 2021-01-10T234039.816.jpeg logger gorm.io/gorm@v1.20.10/logger/logger.go...、Info、Warn、Error、Trace方法 Session.Logger gorm.io/gorm@v1.20.10/gorm.go type Session struct { DryRun...c.processor.callbacks = append(c.processor.callbacks, c) return c.processor.compile() } callback的Remove...的logger提供了Interface接口,可以自己实现并全局设置或者在session级别设置;gorm默认的logger实现了logger.Interface接口定义的LogMode、Info、Warn...doc gorm
序 本文主要研究一下gorm的DeletedAt advance-gorm-3-638.jpg DeletedAt gorm.io/gorm@v1.20.10/soft_delete.go type...DeleteClauses方法使用的是SoftDeleteDeleteClause SoftDeleteQueryClause gorm.io/gorm@v1.20.10/soft_delete.go...方法会追加DeletedAt为nil的查询条件 SoftDeleteDeleteClause gorm.io/gorm@v1.20.10/soft_delete.go type SoftDeleteDeleteClause...方法会回调这些interface的对应方法 小结 gorm的DeletedAt为sql.NullTime类型,它定义了QueryClauses方法,使用的是SoftDeleteQueryClause...doc gorm
序 本文主要研究一下gorm的DeletedAt DeletedAt gorm.io/gorm@v1.20.10/soft_delete.go type DeletedAt sql.NullTime...DeleteClauses方法使用的是SoftDeleteDeleteClause SoftDeleteQueryClause gorm.io/gorm@v1.20.10/soft_delete.go...方法会追加DeletedAt为nil的查询条件 SoftDeleteDeleteClause gorm.io/gorm@v1.20.10/soft_delete.go type SoftDeleteDeleteClause...方法会回调这些interface的对应方法 小结 gorm的DeletedAt为sql.NullTime类型,它定义了QueryClauses方法,使用的是SoftDeleteQueryClause,它的...doc gorm
序 本文主要研究一下gorm的Transaction Transaction gorm.io/gorm@v1.20.10/finisher_api.go // Transaction start a transaction...方法针对非TxCommitter类型的db.Statement.ConnPool执行db.Begin,之后注册defer针对panicked或者err的执行tx.Rollback(),执行fc之后,判断...= nil { t.Error(err) } } 小结 gorm的DB提供了Transaction方法,相当于一个事务模板,自动commit或者rollback,它提供了func...(tx *gorm.DB) error参数用于自定义事务内的数据库操作。...doc gorm
序 本文主要研究一下gorm的logger logger gorm.io/gorm@v1.20.10/logger/logger.go type logger struct { Writer...、Info、Warn、Error、Trace方法 Session.Logger gorm.io/gorm@v1.20.10/gorm.go type Session struct { DryRun...c.processor.callbacks = append(c.processor.callbacks, c) return c.processor.compile() } callback的Remove...的logger提供了Interface接口,可以自己实现并全局设置或者在session级别设置;gorm默认的logger实现了logger.Interface接口定义的LogMode、Info、Warn...doc gorm
序 本文主要研究一下gorm的IsolationLevel IsolationLevel /usr/local/go/src/database/sql/sql.go // IsolationLevel...的Transaction方法提供了*sql.TxOptions参数,可以用于设置Isolation,它最后传递给具体的driver BeginTx github.com/go-sql-driver/mysql...、LevelRepeatableRead、LevelSnapshot、LevelSerializable、LevelLinearizable;gorm的Transaction方法提供了*sql.TxOptions...参数,可以用于设置Isolation,它最后传递给具体的driver;BeginTx会判断若指定的隔离级别不是default则会执行mapIsolationLevel映射到mysql支持的隔离级别,然后执行...doc gorm
序 本文主要研究一下gorm的Unscoped OIP - 2021-01-15T231557.840.jpeg Unscoped gorm.io/gorm@v1.20.11/chainable_api.go...方法在db.Statement.Unscoped为false的时候才追加db.Statement.Schema.DeleteClauses DeleteClauses gorm.io/gorm@v1.20.11...schema.Field) []clause.Interface { return []clause.Interface{SoftDeleteDeleteClause{Field: f}} } 针对带有...= nil { panic(err) } } 小结 gorm的Unscoped方法设置tx.Statement.Unscoped为true;针对软删除会追加SoftDeleteDeleteClause...,即设置deleted_at为指定的时间戳;而callbacks的Delete方法在db.Statement.Unscoped为false的时候才追加db.Statement.Schema.DeleteClauses
序 本文主要研究一下gorm的OnConflict u=1258358460,1662352287&fm=26&gp=0.jpg OnConflict gorm.io/gorm@v1.20.11/clause...Column{Name: value}, Value: Column{Table: "excluded", Name: value}} } return assignments } 的DoUpdates...属性是Set类型,Set类型实际是Assignment数组;其Build方法会组装assignment的sql 实例 func onConflictDemo(db *gorm.DB) { entities...的OnConflict定义了Columns、Where、OnConstraint、DoNothing、DoUpdates、UpdateAll属性;Build方法会根据这些属性拼装sql,如果是DoNothing...doc gorm
比如要查询用户,原来要写SELECT * FROM users WHERE id = ?,现在直接user.FindByID(1)就搞定了。1.2 ORM 的优缺点用ORM确实爽,但也不是万能的。...,有时候还不如直接写SQL出问题时不好调试,生成的SQL可能和你想的不一样1.3 Go 语言中的 ORM 选择Go生态里的ORM框架不少:GORM:功能最全,用的人最多Ent:Facebook出品,代码生成式...SQLBoiler:也是代码生成式,性能不错Beego ORM:Beego框架自带的XORM:比较轻量,上手简单这里主要讲GORM,毕竟是Go语言里最火的ORM框架。...8.2.2 查询优化使用 Select 只查询需要的字段合理使用预加载,避免 N+1 查询对预加载添加条件和限制使用分页避免一次性加载大量数据8.2.3 性能优化创建合适的数据库索引使用批量操作处理大量数据合理配置数据库连接池监控和分析慢查询...8.4 选择建议适合使用 GORM 的场景:快速开发原型和中小型项目团队对 SQL 不够熟悉需要跨数据库兼容性重视开发效率和代码维护性适合使用原生 SQL 的场景:对性能要求极高的项目需要复杂的 SQL
序 本文主要研究一下gorm的prometheus Plugin gorm.io/gorm@v1.20.10/interfaces.go // Plugin GORM plugin interface.../gorm@v1.20.10/gorm.go func (db *DB) Use(plugin Plugin) (err error) { name := plugin.Name() if...的Use方法用于启动一个plugin,它会执行plugin.Initialize(db) 实例 db.Use(prometheus.New(prometheus.Config{...的Plugin接口定义了Name、Initialize方法;gorm的Use方法用于启动一个plugin,它会执行plugin.Initialize(db);Prometheus实现了Plugin接口定义了...doc gorm
序 本文主要研究一下gorm的Locking OIP - 2021-01-18T234935.279.jpeg Locking gorm.io/gorm@v1.20.11/clause/locking.go...Result string Vars []interface{} }{ { []clause.Interface{clause.Select...{}, clause.From{}, clause.Locking{Strength: "UPDATE"}}, "SELECT * FROM `users` FOR UPDATE...{Strength: "SHARE", Table: clause.Table{Name: clause.CurrentTable}}}, "SELECT * FROM `users...doc gorm
序 本文主要研究一下gorm的Locking Locking gorm.io/gorm@v1.20.11/clause/locking.go type Locking struct { Strength...Result string Vars []interface{} }{ { []clause.Interface{clause.Select...{}, clause.From{}, clause.Locking{Strength: "UPDATE"}}, "SELECT * FROM `users` FOR UPDATE...{Strength: "SHARE", Table: clause.Table{Name: clause.CurrentTable}}}, "SELECT * FROM `users...doc gorm
序 本文主要研究一下gorm的CreateInBatches CreateInBatches gorm.io/gorm@v1.20.11/finisher_api.go // CreateInBatches...其rowsAffected是每个批次的rowsAffected的累加 AddError gorm.io/gorm@v1.20.11/gorm.go // AddError add error to db...的CreateInBatches允许用户自定义batchSize,它会根据batchSize来分配进行create,但是他们是在同一个事务的,其rowsAffected是每个批次的rowsAffected...的累加。...doc gorm