【问题标题】:Using a conditional statement IF to control whether a row is added or not使用条件语句 IF 控制是否添加行
【发布时间】:2017-11-16 02:18:05
【问题描述】:

我目前正在学习如何通过 PostgreSQL 使用数据库。我正在定义一个函数,它将根据各种条件将行从一个表添加到另一个表,一个条件是如果目标表中已经存在该行,则不会添加它但不会引发异常,程序将只需继续到下一行。正如您可能已经猜到的那样,所有这些都发生在LOOP...END LOOP 内; FOR

问题是我们的教授认为ON CONFLICT DO NOTHING 不标准,并坚持我们使用另一种方法。我进行了广泛的搜索,但真的不明白如何应用人们在类似情况下提出的一些答案。我的想法确实是:

IF variable1, variable2, variable3 NOT IN (SELECT v1, v2, v3 FROM target_table) THEN INSERT INTO target_table VALUES(variable1, variable2, variable3);
END IF;

但从语法的角度来看,这显然是不正确的。谁能给我一些指导?

谢谢

【问题讨论】:

  • 您说“我进行了广泛的搜索,但真的不明白如何应用人们在类似情况下提出的一些答案”;如果您链接或告诉这些建议,以便更彻底地讨论它们会更好。这将有助于人们进入真正的问题和具体的事情,因为描述有点模糊和冗长
  • 这是个好主意,卡洛斯,这是我第一次问关于她的数据库的问题,我什至没有考虑过。加里的回答给了我我需要的东西,我会记住下一个问题。干杯!

标签: database postgresql if-statement


【解决方案1】:

你可以做类似的事情:

INSERT INTO target_table (v1,v2,v3)
SELECT
    variable1,
    variable2,
    variable3
WHERE NOT EXISTS
(SELECT * FROM target_table 
    WHERE v1 = variable1 and v2 = variable2 and v3 = variable3)

但是有一些注意事项。

如果您的变量之一可以为空,您不能只使用“=”。您需要执行以下操作:

(v1 = variable1 OR (v1 is null and variable1 is null))

而且它很快就会变得庞大,并且在大型表上可能会很慢,因为它会阻止索引被使用。

您还需要担心并发方面。如果您在对表有并发插入/更新的情况下发出此语句,则需要考虑行何时变得可见,因为行可能会在选择和插入之间插入。

查看 PostgreSQL 中的事务隔离设置以了解这些详细信息。

https://www.postgresql.org/docs/10/static/transaction-iso.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多