如何使用squeryl删除表中的所有记录?

3

我查看了使用squeryl从表中删除所有记录的方法。我能想到的唯一方法是

myTable.deleteWhere(r => r.id.isNotNull)  //id is the primary key

这似乎有些奇怪,可能也不太高效。

在使用squeryl时,清除表中所有记录的最简洁方法是什么?


1
关于效率--这可能是真的,但为什么我们需要删除整个数据库变得更快呢?这似乎不太可能成为瓶颈。 - VasiliNovikov
@VasyaNovikov 你说得对。我正在用它进行测试,所以我希望它能快速运行,但是另一方面,我不需要大量的数据来进行测试。 - iwein
1个回答

4
deleteWhere子句接受任何逻辑布尔值,因此您可以简单地说:
myTable.deleteWhere(r => 1 === 1) 

应输出以下语句:

DELETE FROM mytable WHERE 1 = 1

如果您想自动消除where子句,可以尝试以下方法:

myTable.deleteWhere(r => 1 === 1.inhibitWhen(true))

这将完全抑制where子句。

如果您正在寻找更有效的方法,并且您的数据库支持TRUNCATE或另一个等效函数,则可以从org.squeryl.Session获取java.sql.Connection并直接通过JDBC发出查询。不幸的是,这将失去Squeryl提供的某些类型安全性。


谢谢提供的选项,非常有帮助。奇怪的是没有deleteAll或者delete(everyWhere)之类的东西,你觉得呢? - iwein
是的,有一些函数让我有时感到惊讶的是它们不存在。然而,它可以跨数据库系统运行 - 因此原因有时可能在那里。由于通常可以找到可用的东西或执行本地SQL - 我通常可以解决任何缺失的问题。 - jcern
顺便提一下,inhibitWhen 在 MySQL 上不起作用:[error] RuntimeException: Exception while executing statement : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2 [error] errorCode: 1064, sqlState: 42000 [error] delete from Parser [error] where - iwein
"不幸的是,这将失去Squeryl提供的某些类型安全性。" 鉴于我们在这里执行表截断,失去类型安全性可能会产生什么影响?(即我现在看不出类型安全性如何发挥作用) - The Archetypal Paul
通过让编译器验证所有内容,您可以避免 SQL 中出现错误,例如“TRUNCTE 表”,其中拼写错误会导致错误。此外,通过具有类类型,您完全知道自己拥有正确的表,而不是意外剪切和粘贴。尽管对于 deleteWhere 子句而言它的相关性较小,但仍然可能有用。 - jcern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接