【问题标题】:SQL IF ELSE followed by INSERTSQL IF ELSE 后跟 INSERT
【发布时间】:2021-08-10 01:11:56
【问题描述】:

我正在尝试根据是否存在 CONSTRAIN 执行两个不同的 INSERT 语句。到目前为止我使用

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu 
ON cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME 
WHERE tc.CONSTRAINT_TYPE = 'UNIQUE'
AND tc.TABLE_NAME = 'table'
AND cu.COLUMN_NAME = 'user'

我尝试使用 IF EXIST 和 ELSE 来区分两个 INSERT 语句。但显然我只能在 IF ELSE 语句之后使用 SELECT

尝试做这样的事情:

IF NOT EXISTS (SELECT * 
                FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
                INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu 
                ON cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME 
                WHERE tc.CONSTRAINT_TYPE = 'UNIQUE'
                AND tc.TABLE_NAME = 'table1'
                AND cu.COLUMN_NAME = 'user')
    INSERT INTO table1 (username,datainfo) VALUES ('A','test1')
ELSE
    INSERT INTO table1 (username,datainfo) VALUES ('B','test2')

【问题讨论】:

  • 使用 pg 最好的办法是使用插入语句的 ON CONFLICT 子句。
  • 实际上我在 nodejs 后端使用它来动态插入到两个不同的表中。一个表具有上述约束,将在 CONFLICT 上执行 upsert,另一个没有并将执行正常的 INSERT
  • 您要求的内容非常不寻常。约束应该静态定义,除非在数据库迁移期间,所以当你的应用决定插入哪个表时应该知道它。用于检查约束是否存在的选择查询将始终返回 true 或始终返回 false。如果确实需要在运行时检查数据库中是否存在约束,则必须使用存储过程。

标签: sql postgresql plpgsql


【解决方案1】:

IFs 不能在纯 SQL 中使用。您可以使用PL/pgSQL 创建函数、过程或anonymous code block,如下所示:

DO $$
BEGIN
  IF NOT EXISTS (SELECT * 
                FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
                INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu 
                ON cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME 
                WHERE tc.CONSTRAINT_TYPE = 'UNIQUE'
                AND tc.TABLE_NAME = 'table1'
                AND cu.COLUMN_NAME = 'user') THEN
    INSERT INTO table1 (username,datainfo) VALUES ('A','test1');
ELSE
    INSERT INTO table1 (username,datainfo) VALUES ('B','test2');    
 END IF;
END; $$ LANGUAGE plpgsql;

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多