[英]Trying to modify a constraint in PostgreSQL
我检查了Oracle提供的文档,并找到了一种修改约束而不删除表的方法。 问题是,它在修改时出错,因为它无法识别关键字。
使用EMS SQL Manager进行PostgreSQL。
Alter table public.public_insurer_credit MODIFY CONSTRAINT public_insurer_credit_fk1
deferrable, initially deferred;
我可以通过使用以下方法删除约束来解决它:
ALTER TABLE "public"."public_insurer_credit"
DROP CONSTRAINT "public_insurer_credit_fk1" RESTRICT;
ALTER TABLE "public"."public_insurer_credit"
ADD CONSTRAINT "public_insurer_credit_fk1" FOREIGN KEY ("branch_id", "order_id", "public_insurer_id")
REFERENCES "public"."order_public_insurer"("branch_id", "order_id", "public_insurer_id")
ON UPDATE CASCADE
ON DELETE NO ACTION
DEFERRABLE
INITIALLY DEFERRED;
Postgres中的约束没有ALTER
命令。 完成此操作的最简单方法是删除约束并使用所需参数重新添加约束。 当然,约束的任何更改都将针对当前表数据运行。
BEGIN;
ALTER TABLE t1 DROP CONSTRAINT ...
ALTER TABLE t1 ADD CONSTRAINT ...
COMMIT;
根据正确的手册(由PostgreSQL提供, 而不是由Oracle提供),ALTER TABLE语句中没有可用的修改约束:
以下是正确手册的链接:
http://www.postgresql.org/docs/current/static/sql-altertable.html
从版本9.4开始,PostgreSQL支持外键的ALTER TABLE ... ALTER CONSTRAINT
。
此功能将"Allow constraint attributes to be altered, so the default setting of NOT DEFERRABLE can be altered to DEFERRABLE and back."
看看你的问题,我认为那是(有点)你一直在寻找的东西。
更多详细信息和示例可在此处找到:
http://www.depesz.com/2013/06/30/waiting-for-9-4-alter-table-alter-constraint-for-fks/
ALTER CONSTRAINT需要知道外键名称,这并不总是方便的。
这是函数,您只需要知道表名和列名。 用法:
select replace_foreign_key('user_rates_posts', 'post_id', 'ON DELETE CASCADE');
功能:
CREATE OR REPLACE FUNCTION
replace_foreign_key(f_table VARCHAR, f_column VARCHAR, new_options VARCHAR)
RETURNS VARCHAR
AS $$
DECLARE constraint_name varchar;
DECLARE reftable varchar;
DECLARE refcolumn varchar;
BEGIN
SELECT tc.constraint_name, ccu.table_name AS foreign_table_name, ccu.column_name AS foreign_column_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY'
AND tc.table_name= f_table AND kcu.column_name= f_column
INTO constraint_name, reftable, refcolumn;
EXECUTE 'alter table ' || f_table || ' drop constraint ' || constraint_name ||
', ADD CONSTRAINT ' || constraint_name || ' FOREIGN KEY (' || f_column || ') ' ||
' REFERENCES ' || reftable || '(' || refcolumn || ') ' || new_options || ';';
RETURN 'Constraint replaced: ' || constraint_name || ' (' || f_table || '.' || f_column ||
' -> ' || reftable || '.' || refcolumn || '); New options: ' || new_options;
END;
$$ LANGUAGE plpgsql;
请注意:此函数不会复制初始外键的属性。 它只需要外表名/列名,删除当前键并替换为新键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.