在PostgreSQL 8中,是否可以向下表中的两个外键添加ON DELETE CASCADES,而不删除后者
\d分数
表“公众得分”
列|类型|修饰符
---------+-----------------------+-----------
id |字符变化(32)|
gid |整数|
货币|整数|不为空
退出|布尔|
最后一个ip地址|
外键约束:
“分数”外键(gid)引用游戏(gid)
“分数\ id \ fkey”外键(id)引用用户(id)
两个参考表如下-此处:
\d游戏
表“公共游戏”
列|类型|修饰符
----------+-----------------------------+----------------------------------------------------------
gid |整数|非空默认值nextval('games_gid_seq'::regclass)
舍入|整数|不为空
已完成|时间戳不带时区|默认值现在()
索引:
“games_pkey”主键,btree(gid)
引用人:
表“分数”约束“分数”外键(gid)引用游戏(gid)
在这里:
\d用户
表“public.users”
列|类型|修饰符
------------+-----------------------------+---------------
id |字符变化(32)|不为空
第一个|名称|字符变化(64)|
姓氏|字符变化(64)|
女性|布尔|
化身|角色变化(128)|
城市|性格多变(64)|
登录|没有时区的时间戳|现在默认()
最后一个ip地址|
注销|不带时区的时间戳|
vip |不带时区的时间戳|
邮件|字符变化(254)|
索引:
“用户密钥”主键,btree(id)
引用人:
表“cards”约束“cards\u id\u fkey”外键(id)引用用户(id)
表“catch”约束“catch\u id\u fkey”外键(id)引用用户(id)
表“chat”约束“chat\u id\u fkey”外键(id)引用用户(id)
表“游戏”约束“游戏id”外键(id)引用用户(id)
表“hand”约束“hand\u id\u fkey”外键(id)引用用户(id)
表“luck”约束“luck\u id\u fkey”外键(id)引用用户(id)
表“匹配”约束“匹配id”外键(id)引用用户(id)
表“misere”约束“misere_id_fkey”外键(id)引用用户(id)
表“money”约束“money\u id\u fkey”外键(id)引用用户(id)
表“pass”约束“pass\u id\u fkey”外键(id)引用用户(id)
表“付款”约束“付款id”外键(id)引用用户(id)
表“rep”约束“rep_author_fkey”外键(author)引用用户(id)
表“rep”约束“rep_id_fkey”外键(id)引用用户(id)
表“分数”约束“分数\ id \ fkey”外键(id)引用用户(id)
表“status”约束“status\u id\u fkey”外键(id)引用用户(id)
我还想知道在前一个表中添加两个索引是否有意义
更新:谢谢,而且我在邮件列表中得到了建议,我可以在一条语句中管理它,因此无需明确启动交易:
更改表public.scores
删除约束分数\u gid\u fkey,
添加约束分数\u gid\u fkey
外键(gid)
参考游戏(gid)
删除级联;
我很确定,您不能简单地将delete cascade上的添加到现有的外键约束中。必须先删除约束,然后添加正确的版本。在标准SQL中,我认为最简单的方法是
- 启动交易
- 放下外键
- 在delete cascade上添加一个带有
的外键,最后 - 提交事务
对要更改的每个外键重复此操作
但是PostgreSQL有一个非标准扩展,允许您在一条SQL语句中使用多个约束子句。比如说
更改表public.scores
删除约束分数\u gid\u fkey,
添加约束分数\u gid\u fkey
外键(gid)
参考游戏(gid)
删除级联;
如果不知道要删除的外键约束的名称,可以在pgAdminIII中查找它(只需单击表名并查看DDL,或者展开层次结构直到看到“约束”),也可以查询信息架构
选择*
来自信息\u schema.key\u列\u用法
其中,唯一约束中的位置不为空