如何实现同一公司在同一城市仅一个分支机构的表约束?
实现公司-城市唯一约束的方案
要确保每家公司在每个城市最多只能有一个分支机构,核心是用复合唯一约束或者复合主键——这两种方式都能让数据库校验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
相关产品推荐
相关产品推荐

