7

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

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

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,但我想保持它相当通用。

(编辑)这些是我当前的表定义(为说明目的而简化):

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
}
4

1 回答 1

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")
  }
}
于 2013-09-18T12:29:49.567 回答