You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现同一公司在同一城市仅一个分支机构的表约束?

实现公司-城市唯一约束的方案

要确保每家公司在每个城市最多只能有一个分支机构,核心是用复合唯一约束或者复合主键——这两种方式都能让数据库校验Company_name和city的组合值唯一性,既允许不同公司共享同一城市,又禁止同一家公司在同一城市重复创建条目。

方案1:复合唯一约束

这是最常用的方案,适合表已有独立主键(比如branch_id)的场景,通过显式声明组合字段的唯一性约束来实现:

MySQL 示例

CREATE TABLE company_branches (
    branch_id INT AUTO_INCREMENT PRIMARY KEY,
    Company_name VARCHAR(100) NOT NULL,
    city VARCHAR(100) NOT NULL,
    branch_address TEXT,
    established_date DATE,
    -- 定义复合唯一约束
    CONSTRAINT uc_company_city UNIQUE (Company_name, city)
);

PostgreSQL 示例

CREATE TABLE company_branches (
    branch_id SERIAL PRIMARY KEY,
    Company_name VARCHAR(100) NOT NULL,
    city VARCHAR(100) NOT NULL,
    branch_address TEXT,
    established_date DATE,
    CONSTRAINT uc_company_city UNIQUE (Company_name, city)
);

SQL Server 示例

CREATE TABLE company_branches (
    branch_id INT IDENTITY(1,1) PRIMARY KEY,
    Company_name VARCHAR(100) NOT NULL,
    city VARCHAR(100) NOT NULL,
    branch_address TEXT,
    established_date DATE,
    CONSTRAINT uc_company_city UNIQUE (Company_name, city)
);

当尝试插入重复的Company_name + city组合时,数据库会直接抛出唯一性冲突错误,阻止操作执行。

方案2:复合主键

如果Company_name和city的组合本身就能唯一标识每条记录(不需要额外的branch_id),可以直接将这两个字段设为复合主键——主键自带唯一性约束:

CREATE TABLE company_branches (
    Company_name VARCHAR(100) NOT NULL,
    city VARCHAR(100) NOT NULL,
    branch_address TEXT,
    established_date DATE,
    PRIMARY KEY (Company_name, city)
);

这种方案更简洁,省去了额外的唯一约束声明,但要注意:主键字段不允许为NULL,所以需要确保Company_name和city都设置了NOT NULL约束。

内容的提问来源于stack exchange,提问作者Ahmed Akkad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:14