Scalatra / Slick并插入IF NOT EXISTS

时间:2013-09-18 05:14:01

标签: database scala slick scalatra

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

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

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 )
);

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

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

实现这样的目标最有效的方法是什么?如果重要的话我正在使用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
}

1 个答案:

答案 0 :(得分: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") )
  }
}

在Slick 2.0中

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