zoukankan      html  css  js  c++  java
  • 1021.表-依赖

    为了保证整个数据库结构的完整性,PostgreSQL确保我们无法删除仍然被其他对象依赖的对象。

    使用CASCADE,这样所有的依赖对象将被移除,同样依赖于它们的任何对象也会被递归删除

    Drop的一组本身有依赖的对象,不用添加cascade去删除,除非还有额外依赖。

    对于用户定义的函数,PostgreSQL会追踪与函数外部可见性质相关的依赖性,例如它的参数和结果类型,但不追踪检查函数体才能知道的依赖性(例如内部引用的表)

    当我们创建一个涉及到很多具有外键约束、视图、触发器、函数等的表的复杂数据库结构时,我们隐式地创建了一张对象之间的依赖关系网。例如,具有一个外键约束的表依赖于它所引用的表。

    为了保证整个数据库结构的完整性,PostgreSQL确保我们无法删除仍然被其他对象依赖的对象。

    DROP TABLE products;

    ERROR:  cannot drop table products because other objects depend on it

    DETAIL:  constraint orders_product_no_fkey on table orders depends on table products

    HINT:  Use DROP ... CASCADE to drop the dependent objects too.

    该错误消息包含了一个有用的提示:如果我们不想一个一个去删除所有的依赖对象,我们可以执行:

    DROP TABLE products CASCADE;

    这样所有的依赖对象将被移除,同样依赖于它们的任何对象也会被递归删除。在这种情况下,订单表不会被移除,但是它的外键约束会被移除。

    之所以在这里会停下,是因为没有什么依赖着外键约束(如果希望检查DROP ... CASCADE会干什么,运行不带CASCADEDROP并阅读DETAIL输出

    PostgreSQL中的几乎所有DROP命令都支持CASCADE。当然,其本质的区别随着对象的类型而不同。我们也可以用RESTRICT代替CASCADE来获得默认行为,它将阻止删除任何被其他对象依赖的对象。

    注意:

    根据SQL标准,在DROP命令中指定RESTRICT或CASCADE是被要求的。但没有哪个数据库系统真正强制了这个规则,但是不同的系统中两种默认行为都是可能的。

    如果一个DROP命令列出了多个对象,只有在存在指定对象构成的组之外的依赖关系时才需要CASCADE。例如,如果发出命令DROP TABLE tab1, tab2且存在从tab2到tab1的外键引用,那么就不需要CASCADE即可成功执行。

    对于用户定义的函数,PostgreSQL会追踪与函数外部可见性质相关的依赖性,例如它的参数和结果类型,但不追踪检查函数体才能知道的依赖性。例如,考虑这种情况:

    CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow',

                                 'green', 'blue', 'purple');

    CREATE TABLE my_colors (color rainbow, note text);

    CREATE FUNCTION get_color_note (rainbow) RETURNS text AS

      'SELECT note FROM my_colors WHERE color = $1'

      LANGUAGE SQL;

    PostgreSQL将会注意到get_color_note函数依赖于rainbow类型:删掉该类型会强制删除该函数,因为该函数的参数类型就无法定义了。

    但是PostgreSQL不会认为get_color_note依赖于my_colors表,因此即使该表被删除也不会删除这个函数。虽然这种方法有缺点,但是也有好处。如果该表丢失,这个函数在某种程度上仍然是有效的,但是执行它会导致错误。创建一个同名的新表将允许该函数重新有效。

  • 相关阅读:
    常用的正则表达式
    vue多页面应用
    webpack + jquery + bootstrap 环境配置
    Goroutine的几个例子
    设置css通用字体
    简单的gulpfile.js参数配置
    1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车
    github上比较全的知识
    秒杀倒计时
    正则校验手机号码并获取手机验证码倒计时的实例
  • 原文地址:https://www.cnblogs.com/bufuzhou/p/14238756.html
Copyright © 2011-2022 走看看