【发布时间】: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