【问题标题】:SQLite drop table when row in another table is deleted删除另一个表中的行时,SQLite 删除表
【发布时间】:2018-10-16 06:24:47
【问题描述】:

我一直在努力设置触发器并不断收到错误:

“DROP”附近的 SQL 逻辑错误:语法错误

我有几个表 main_table、other_one、other_two 等。

  1. ma​​in_table 有几列,主键列名为 filehash
  2. ma​​in_table的主键列的值也是other_*表的名称

所以,如果我删除 ma​​in_table 中主键为 other_one 的行,我希望触发器也删除表 other_one

这是产生错误的触发器语句

CREATE TRIGGER remove_other_one AFTER DELETE ON 'main_table' 
WHEN (OLD.filehash == 'other_one')
BEGIN
 DROP TABLE IF EXISTS 'other_one' ; 
END remove_other_one;

编辑:我在 SQLite DB 浏览器中运行触发器语句时得到的“更完整”错误是:

“DROP”附近:语法错误:CREATE TRIGGER remove_other_one AFTER DELETE ON 'main_table' WHEN (OLD.filehash == 'other_one') BEGIN DROP

【问题讨论】:

  • 去掉引号。 DROP TABLE IF EXISTS other_one
  • 删除这些引号时出现同样的错误。
  • 我认为你的 sqlite 版本不支持DROP TABLE IF EXSITS。在没有IF EXISTS 的情况下删除表格是否有效?
  • 删除IF EXISTS 并仅使用DROP TABLE 时出现同样的错误
  • 您是否正在从某个脚本执行查询?你能提供你要删除的table_name吗?

标签: sql sqlite triggers


【解决方案1】:

基于SQLite trigger doc我认为是不可能的:

触发器内部没有 DDL/动态 SQL 选项。

我猜你想实现PostgreSQL DBFiddle Demo 1 Demo 2 之类的东西

您可以在应用程序代码中处理您的情况。无论如何table per date/customer/hash 几乎总是表明设计不佳,从长远来看会导致更多问题。

【讨论】:

  • 感谢您的回复,但这不适用于 SQLite(您将其作为 postgress 运行,但只需选择 SQLite 3.8,当我在 SQLite Db 浏览器中运行该代码时,您将收到我现在遇到的错误)
  • @Nepaluz 请再次阅读我的回答。 正如我所说,您想要实现的目标在 SQLite 中是不可能实现的。我发布了 PostgreSQL 作为示例,如果 SQLite 将在触发器中支持 DDL 或动态 SQL,如何实现。
  • 我确实“看到”了这一点,但并没有挂在 DDL 上,只是获得了受支持的正确语法。这就是问题(尽管有好的和/或坏的设计)。
  • @Nepaluz: DROP TABLE 在触发器中不受支持,因此无法获得正确的语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多