下面分条说明关系型数据库中常见的三个概念:主键(Primary Key)、外键(Foreign Key)和 Schema。为了便于理解,示例 SQL 使用通用 ANSI 语法并穿插 MySQL/PostgreSQL 的差异说明。

────────────────────────
一、主键 (Primary Key)
────────────────────────

  1. 定义
    • 表中用来唯一标识一行数据的列或列组(组合主键)。
    • 每张表最多只能有一个主键约束。

  2. 约束特性
    • 唯一性:同一张表中任何两行主键值都不能重复。
    • 非空:值不能为空(NOT NULL)。
    • 稳定性:主键一般不修改,避免关联表大量更新。

  3. 实现细节
    • 创建主键时,数据库会自动为其建立唯一索引。
    • 可用单列(最常见的自增 ID、UUID)或多列组合:

    CREATE TABLE order_items (
      order_id  INT ,
      line_no   INT ,
      product_id INT,
      PRIMARY KEY (order_id, line_no)
    );
    
  4. 作用
    • 查询、更新、删除时的最快定位手段。
    • 供外键引用,维系表间关系。

────────────────────────
二、外键 (Foreign Key)
────────────────────────

  1. 定义
    • 表中的一个或一组列,这些列的值必须在另一张表(父表)对应主键或唯一键中存在,形成父子(引用)关系。

  2. 约束特性
    • 保证引用完整性(Referential Integrity):子表不能存“孤儿”数据。
    • 可为 NULL:如果关系是可选的,可允许 NULL 表示“尚未关联”。
    • 可设置级联动作:

    • ON DELETE CASCADE:父表删除行时,子表对应行也删除。
    • ON UPDATE CASCADE:父表主键修改时,子表自动同步。
  3. 示例

    CREATE TABLE customers (
      customer_id INT PRIMARY KEY,
      name        VARCHAR(50)
    );
    
    CREATE TABLE orders (
      order_id    INT PRIMARY KEY,
      customer_id INT,
      amount      DECIMAL(10,2),
      FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE CASCADE
    );
    
  4. 作用
    • 保证数据一致性:不允许订单指向不存在的客户。
    • 提升建模清晰度:显式描述表之间的“一对多”“多对一”等关系。

────────────────────────
三、Schema
────────────────────────

  1. 概念层级(不同产品略有差异)
    • ANSI/ISO SQL:Schema 是逻辑命名空间,用来组织数据库对象(表、视图、存储过程、类型 …)。
    • PostgreSQL:一个数据库 (database) 里可以包含多个 schema;同名对象可以存在于不同 schema。
    • Oracle:用户=schema,每个登录用户拥有自己的 schema。
    • MySQL:传统上将 database 视为 schema,本身不再向下分层。

  2. 功能
    • 逻辑隔离:同一数据库服务器上,不同业务或模块可放在不同 schema。
    • 名称限定:schema_name.table_name,解决同名冲突。
    • 权限粒度:可对 schema 级别授予/回收对象创建或访问权限。
    • 方便迁移与备份:导出/导入特定 schema 即可完成业务级的数据迁移。

  3. 示例

    -- PostgreSQL 创建 schema
    CREATE SCHEMA sales AUTHORIZATION alice;
    
    -- 在指定 schema 下建表
    CREATE TABLE sales.orders (
      order_id   SERIAL PRIMARY KEY,
      order_date DATE
    );
    
    -- 查询时显示加上前缀
    SELECT * FROM sales.orders;
    
  4. 与主键/外键的关系
    • 主键、外键属于表级约束,表又隶属于某个 schema;因此可以把 schema 理解为“数据库对象的最外层分组”。

────────────────────────
四、小结
────────────────────────

  1. 主键:唯一且非空,用来标识行、建立索引并被其他表引用。
  2. 外键:子表指向父表主键/唯一键的列,强制数据引用有效,支持级联操作。
  3. Schema:数据库内的逻辑命名空间(或用户),用于组织、隔离、授权和管理大量对象。

理解这三个概念及其相互作用,是进行关系型数据库建模与性能优化的基础。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐