Golang中如何使用db.Exec实现Insert时添加where not exists条件
Golang中如何使用db.Exec实现Insert时添加where not exists条件 这个语句可以正常工作,所以我知道我的连接字符串等配置是好的:
result, err = db.Exec("INSERT INTO [dbo].[Priority] ([Priority_SHA256]) VALUES ($1), string(cfg.General.PrioritySHA256[:]))
但是当我添加 WHERE NOT EXISTS 子句时,我无法弄清楚如何替换值(请参见下面加粗的部分):
result, err = db.Exec(“INSERT INTO [dbo].[Priority] ([Priority_SHA256]) VALUES ($1) WHERE NOT EXISTS ( SELECT ‘x’ FROM [dbo].[Priority] WHERE [Priority_SHA256] = **string(cfg.General.PrioritySHA256[:])**)”, string(cfg.General.PrioritySHA256[:]))
连接的是 SQL Server 数据库。
更多关于Golang中如何使用db.Exec实现Insert时添加where not exists条件的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我尝试过并且也这么做了,但在遇到第一个“WHERE”时报错了。
错误:(16, 556) 应为 ,却得到了 ‘WHERE’
更多关于Golang中如何使用db.Exec实现Insert时添加where not exists条件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的意思是:
INSERT INTO [dbo].[Priority] ([Priority_SHA256]) VALUES ($1) WHERE NOT EXISTS ( SELECT ‘x’ FROM [dbo].[Priority] WHERE [Priority_SHA256] = $1)
在Golang中使用db.Exec实现INSERT时添加WHERE NOT EXISTS条件,你需要将查询参数正确传递到SQL语句中。对于SQL Server,可以使用@p1作为参数占位符,而不是$1。
以下是正确的实现方式:
query := `
INSERT INTO [dbo].[Priority] ([Priority_SHA256])
SELECT @p1
WHERE NOT EXISTS (
SELECT 1
FROM [dbo].[Priority]
WHERE [Priority_SHA256] = @p1
)`
result, err := db.Exec(query, string(cfg.General.PrioritySHA256[:]))
if err != nil {
// 处理错误
}
或者使用?作为参数占位符(取决于你的SQL Server驱动):
query := `
INSERT INTO [dbo].[Priority] ([Priority_SHA256])
SELECT ?
WHERE NOT EXISTS (
SELECT 1
FROM [dbo].[Priority]
WHERE [Priority_SHA256] = ?
)`
result, err := db.Exec(query,
string(cfg.General.PrioritySHA256[:]),
string(cfg.General.PrioritySHA256[:]))
if err != nil {
// 处理错误
}
如果你使用的是github.com/denisenkom/go-mssqldb驱动,也可以这样写:
query := `
IF NOT EXISTS (SELECT 1 FROM [dbo].[Priority] WHERE [Priority_SHA256] = @p1)
BEGIN
INSERT INTO [dbo].[Priority] ([Priority_SHA256])
VALUES (@p1)
END`
result, err := db.Exec(query, sql.Named("p1", string(cfg.General.PrioritySHA256[:])))
if err != nil {
// 处理错误
}
检查受影响的行数:
rowsAffected, err := result.RowsAffected()
if err != nil {
// 处理错误
}
fmt.Printf("插入了 %d 行\n", rowsAffected)
关键点是确保WHERE子句中的参数也使用相同的参数占位符,并在db.Exec调用中提供相应的参数值。

