我想列出所有符合条件的反义词,然后删除它们。
DO $$
DECLARE r RECORD;
BEGIN
FOR r in SELECT
conrelid::regclass,
conname
FROM
pg_constraint
WHERE
contype IN ('u')
AND connamespace = 'public'::regnamespace
AND conname ~* '_key'
LOOP
EXECUTE 'ALTER TABLE % DROP CONSTRAINT %',r.conrelid, r.conname;
END LOOP;
END;
$$
当我执行这个时,我得到
ERROR: query "SELECT 'ALTER TABLE % DROP CONSTRAINT %',r.conrelid, r.conname" returned 3 columns
CONTEXT: PL/pgSQL function inline_code_block line 14 at EXECUTE
SQL state: 42601
为什么会返回3列?
解决方案:
你不能把这样的标识符传递给动态SQL。使用 format()
而不是。
EXECUTE format('ALTER TABLE %I DROP CONSTRAINT %I', r.conrelid::text, r.conname::text);