【问题标题】:how to check if insert or update will affect result of a select query如何检查插入或更新是否会影响选择查询的结果
【发布时间】:2017-09-25 16:11:39
【问题描述】:

我有sql表:

CREATE TABLE station 
  (title CHAR(256) PRIMARY KEY, 
   city CHAR(20),
   latitude REAL, 
   longitude REAL);

我有一些疑问,例如Q1

SELECT * FROM station WHERE latitude > 50 AND longitude > 90;

第二季度

SELECT * FROM station WHERE latitude > 50 OR longitude > 90;

如何确定下一个插入查询:

INSERT INTO station VALUES ("Station 1", "London", 60, 10)

会改变Q2的结果,而不是Q1

假设选择查询可以无限复杂,有时很难回答这样的问题,这就是误报适合的原因。


换句话说,我该如何编写这样的函数(Python)?

def can_affect(insert_query: str, select_query: str) -> bool:
    """
    Tells if particular insert query can affect results of select query. 

    Returns False if there is no chance that insert will affect select query.
    Otherwise, returns True.
    """

【问题讨论】:

  • 您正在测试的查询是否总是只处理单个表?或者是否存在连接到其他表的情况是查询的一部分?
  • @MikeTheReader,是的,查询可以包含与其他表的连接。例如,当给出 "SELECT a JOIN b JOIN c""INSERT INTO d" 时,函数必须返回 False

标签: python mysql sql database postgresql


【解决方案1】:

编辑:使用 Postgres 事务。

  1. 执行“BEGIN TRANSACTION READ WRITE;”。
  2. 执行选择。记录返回的行数。
  3. 执行插入。
  4. 再次执行选择。记录返回的行数。
  5. 执行“回滚;”。这将撤消您对表格所做的任何更改。
  6. 如果选择之间的行数不同,则返回 true。否则,错误。

【讨论】:

  • 请记住,对于方法 A,在第 1 步和第 2 步之间有可能另一个进程可能会添加可能会更改计数的记录。 (这是一个很小的窗口,但并非完全不可能。)
  • 您提供的解决方案在某些情况下可以使用,但在大多数情况下不会有效。我想通过分析这两个查询+一些关于数据库模式的信息来回答这个问题。
  • 什么情况下无效?我有兴趣看到一个不会有的案例。
  • 我也不建议您尝试自己解析查询或模式。一般来说,最好让工具完成工作,并操纵所提供的功能。不要假装自己是 Postgres——工作量太大。
  • @PaulHoisington,如果我将有 1000 个不同的查询,我将需要对每个插入执行 2000 个选择查询。我不认为这是有效的。我真的不想编写自己的查询解析器,这就是为什么我正在寻找一些提供此类功能的工具或 API。
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2013-10-24
  • 2023-03-29
相关资源
最近更新 更多