sql - 对多个表的数据库约束

标签 sql sql-server

假设我有以下表格:

CREATE TABLE [Weeks] 
(
    [Id] INT NOT NULL IDENTITY,
    CONSTRAINT [PK_Weeks] PRIMARY KEY ([Id])
);

CREATE TABLE [Days] 
(
    [Id] INT NOT NULL IDENTITY,
    [WeekId] INT NULL,

    CONSTRAINT [PK_Days] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Days_Weeks_WeekId] 
        FOREIGN KEY ([WeekId]) REFERENCES [Weeks] ([Id])
);

CREATE TABLE [ReplacedDayInWeek] 
(
    [Id] INT NOT NULL IDENTITY,
    [WeekId] INT NOT NULL,
    [DayId] INT NOT NULL,
    [ReplacedDayId] INT NOT NULL,

    CONSTRAINT [PK_ReplacedDayInWeek] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_ReplacedDayInWeek_Days_DayId] 
        FOREIGN KEY ([DayId]) REFERENCES [Days] ([Id]),
    CONSTRAINT [FK_ReplacedDayInWeek_Weeks_WeekId] 
        FOREIGN KEY ([WeekId]) REFERENCES [Weeks] ([Id]),
    CONSTRAINT [FK_ReplacedDayInWeek_Weeks_ReplacedWeekId] 
        FOREIGN KEY ([ReplacedWeekId]) REFERENCES [Weeks] ([Id])
);

ReplacedDayInWeek 表包含特定周中被另一天替换的一天。

我如何创建一个 SQL 约束(或者可能是另一个基于 SQL 的解决方案),以确保我只能将行插入到 DayInWeek 中,其中包含 DayId周为 WeekId?

我正在寻找对源数据库进行最少更改的解决方案。我更喜欢存储过程之上的附加表或表更改。

最佳答案

这个数据结构对我来说毫无意义。您在两个 表中有天数和周数之间的映射。

您真的应该只将周存储在一个表中,然后在另一个表中查找。

也就是说,您可以在两个表之间的日/周使用额外的约束来做您想做的事情:

CREATE TABLE [Days] 
(
    [Id] INT NOT NULL IDENTITY,
    [WeekId] INT NULL,

    CONSTRAINT [PK_Days] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Days_Weeks_WeekId] 
        FOREIGN KEY ([WeekId]) REFERENCES [Weeks] ([Id]),
    CONSTRAINT UNQ_Days_WeekId_Id UNIQUE (WeekId, Id)
);

CREATE TABLE [DaysInWeek] 
(
    [Id] INT NOT NULL IDENTITY,
    [WeekId] INT NOT NULL,
    [DayId] INT NOT NULL,

    CONSTRAINT [PK_DaysInWeek] PRIMARY KEY([Id]),
    CONSTRAINT [FK_DaysInWeek_Days_WeekId_DayId] 
        FOREIGN KEY (WeekId, DayId) REFERENCES Days(WeekId, Id),
    CONSTRAINT [FK_DaysInWeek_Weeks_WeekId] 
        FOREIGN KEY ([WeekId]) REFERENCES [Weeks] ([Id])
);

关于sql - 对多个表的数据库约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55760300/

相关文章:

mysql - 左连接和右连接是否足够?

sql - 如何将远程 SQL Server 数据库备份到本地驱动器?

sql - 恢复数据库 — 错误 RESTORE HEADERONLY 异常终止。

sql-server - 数据库选项具有对文件组 [FILESTREAM] 的未解析引用

sql - 获取基本的SQL Server表结构信息

sql - MySQL 使用 REGEX 匹配逗号分隔值中是否存在术语

java - Jooq 插入重复键更新

sql - Golang 并发 SQL 事务

sql - 如何在查询中使用除法函数?

sql-server - Coldfusion执行sql语句出错