通过在 Postgresql 中存储在具有特殊字符的变量名中来删除约束
Drop constraint by stored in a variable name with special characters in Postgresql
我想删除名称未知的约束,所以我使用以下代码:
EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT '||fk_Name||';';
问题是 fk_Name 以“~”结尾,所以出现语法错误。
完整代码:
DO $$
DECLARE fk_Name TEXT;
BEGIN
fk_Name := (SELECT
tc.constraint_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='IntravenousTherapyAppointment' AND ccu.table_name='MedicamentMeasurementUnit');
IF fk_Name IS NOT NULL THEN
EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT '||fk_Name||';';
END IF;
END $$;
这应该可以解决您的问题:
DO $$
DECLARE fk_Name TEXT;
BEGIN
fk_Name := (SELECT
tc.constraint_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='IntravenousTherapyAppointment' AND ccu.table_name='MedicamentMeasurementUnit');
IF fk_Name IS NOT NULL THEN
EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT "'||fk_Name||'";';
END IF;
END $$;
P.S: Be careful while handling the objects/constraints having double quoted names.
我想删除名称未知的约束,所以我使用以下代码:
EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT '||fk_Name||';';
问题是 fk_Name 以“~”结尾,所以出现语法错误。
完整代码:
DO $$
DECLARE fk_Name TEXT;
BEGIN
fk_Name := (SELECT
tc.constraint_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='IntravenousTherapyAppointment' AND ccu.table_name='MedicamentMeasurementUnit');
IF fk_Name IS NOT NULL THEN
EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT '||fk_Name||';';
END IF;
END $$;
这应该可以解决您的问题:
DO $$
DECLARE fk_Name TEXT;
BEGIN
fk_Name := (SELECT
tc.constraint_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='IntravenousTherapyAppointment' AND ccu.table_name='MedicamentMeasurementUnit');
IF fk_Name IS NOT NULL THEN
EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT "'||fk_Name||'";';
END IF;
END $$;
P.S: Be careful while handling the objects/constraints having double quoted names.