2017-09-25 51 views
0

我有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; 

Q2

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

如何确定t帽子旁边插入查询:

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. 
    """ 
+0

您正在测试的查询是否只处理单个表?或者是否会出现与其他表的连接是查询的一部分的情况? – MikeTheReader

+0

@MikeTheReader,是的,查询可以包含连接到其他表。例如,当给出“SELECT a JOIN b JOIN c”**和**“INSERT INTO d”**时,函数必须返回** False **。 –

回答

1

编辑:使用Postgres的事务。

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

请记住,使用方法A时,步骤1和步骤2之间可能会有另一个进程添加可能更改计数的记录。 (这是一个非常小的窗口,但并非完全不可能。) – MikeTheReader

+0

您提供的解决方案可以在某些情况下使用,但在大多数情况下它不会有效。我想通过分析两个查询+关于数据库模式的一些信息来回答这个问题。 –

+0

在什么情况下它不会有效?我有兴趣看到一个不会出现的情况。 –

相关问题