Scalatra/Slick并插入IF NOT EXISTS

Wil*_* Am 7 database scala scalatra slick

我是一个新手,所以希望有一些耐心.:)

如果某个值不存在,我会尝试填充两个表.基本上我有:

TABLE b
(
    id VARCHAR(254) PRIMARY KEY NOT NULL
);


TABLE d
(
    id VARCHAR(254) PRIMARY KEY NOT NULL,
    relay INT NOT NULL,
    FOREIGN KEY ( relay ) REFERENCES b ( id )
);
Run Code Online (Sandbox Code Playgroud)

所以我正在尝试编写一个函数,用一个新值填充两个表,如果它不存在,或者忽略它,否则......当然包含在一个事务中:

IF (NOT EXISTS(SELECT * FROM b where id='something'))
    insert into b values('something')
    insert into d values(1, 'something')
END
Run Code Online (Sandbox Code Playgroud)

实现这样的目标最有效的方法是什么?如果重要的是我正在使用POstgreSQL 9.1,但我想保持它相当通用.

(编辑)这些是我当前的表格defs(为简化说明而简化):

object d extends Table[(String, String, Int)]("d")
{
  def id=column[String]("id", O.PrimaryKey)

  def relay=column[Int]("relay")
  def relay_ref=foreignKey("d2b.fk", relay, b)(_.id)
  def * = id ~ relay
}
object b extends Table[(String)]("b")
{
  def id=column[String]("id", O.PrimaryKey)
  def * = id
}
Run Code Online (Sandbox Code Playgroud)

cvo*_*ogt 10

在Slick 1.0.1中

db.withTransaction{ implicit session : Session =>
  if( ! Query(b).filter(_.id==="something").exists.run ){
    b.insert( "something" )
    d.insert( (1,"something") )
  }
}
Run Code Online (Sandbox Code Playgroud)

在Slick 2.0中

val b = TableQuery[b]
db.withTransaction{ implicit session =>
  if( ! b.filter(_.id==="something").exists.run ){
    b += "something"
    d += (1,"something")
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定,这是处理重复插入的最佳方式.我最近写了一篇关于它的文章.你应该阅读它.http://i.am.michiel.fr/article/2013/08/07/mysql-insert-performance.html (2认同)