当前位置:   article > 正文

【学习笔记】PostgreSQL之外键_postgresql 外键

postgresql 外键

在 PostgreSQL 中,外键(Foreign Key)是一种数据库约束,用于维护表之间的关联关系。外键确保一个表的一列(子列)的值引用了另一个表(父表)的主键或唯一键列的值。这有助于维护表之间的一致性和完整性,以及执行引用完整性检查。

  1. 外键约束的创建:要在表中创建外键,你需要使用 FOREIGN KEY 约束。外键约束会将一个表的列与另一个表的主键或唯一约束关联起来。示例:

    CREATE TABLE orders (
        order_id serial PRIMARY KEY,
        customer_id integer,
        order_date date,
        -- 创建外键约束,将 customer_id 与 customers 表的 customer_id 关联
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  2. 外键约束的作用

    • 引用完整性:外键确保引用的数据在父表中存在。如果尝试插入或更新一个无效的外键值,将触发约束违反错误。
    • 维护数据关系:外键定义了表之间的关联关系。这对于建立复杂的数据模型和查询非常有用。
    • 级联操作:外键约束还支持级联操作。这意味着可以在删除或更新父表的行时自动执行相关操作,如级联删除或级联更新。
  3. 级联操作:外键约束支持以下级联操作:

    • ON DELETE CASCADE:当父表的行被删除时,相关的子表行也将被删除。
    • ON UPDATE CASCADE:当父表的主键被更新时,相关的子表行也将被更新。
    • 其他级联操作如 SET NULL, SET DEFAULT, RESTRICTNO ACTION 也是可用的。
  4. 外键的限制

    • 子表(包含外键的表)的外键值必须引用父表中存在的值。如果引用了不存在的值,将引发外键违反错误,比如:
CREATE TABLE cities (
 city varchar(80) primary key,
 location point
);
-- weather表中的city指向cites表中的city主键
CREATE TABLE weather (
 city varchar(80) references cities(city),
 temp_lo int,
 temp_hi int,
 prcp real,
 date date
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

现在尝试插入一个非法的记录:

INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
  • 1
ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey"
 "weather_city_fkey"
DETAIL: Key (city)=(Berkeley) is not present in table "cities".
  • 1
  • 2
  • 3

此时执行插入的语句抛出了一个外键约束的异常,因为向weather表中插入的数据中,包含了主表cites中不存在的数据Berkeley

  • 外键引用不能包含 NULL 值,除非父表的唯一键列也允许 NULL
  1. 删除外键约束:可以使用 DROP CONSTRAINT 语句来删除外键约束。
ALTER TABLE weather DROP CONSTRAINT weather_city_fkey;
  • 1

外键名字默认是附表名_主表名_fkey

PostgreSQL 的外键约束是保持数据库完整性的重要工具之一,它有助于确保数据的一致性,同时支持建立复杂的数据模型。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/583971
推荐阅读
相关标签
  

闽ICP备14008679号