首页 > 解决方案 > 根据 ID 引用更新另一个表中的值

问题描述

我有两个名为Jobs&的表Tags。在 Jobs 表中,我有一个名为 TagID 的列。我希望这是一个在标签表中引用 TagID 的 ID。

工作

|Id, CompanyName, Title, Link, TagId, PublishedDate, Country, City, Description|

标签

|Id, TagId, Tag|

基本上我想Jobs.TagId引用Tags.TagId并且当一个条目Jobs被修改时我想要一个条目Tags来尊重该更改(即,如果一个条目Jobs被删除,那么标签中具有该作业 TagId 的所有条目也应该被删除)。

我试过的:

CREATE TABLE Tags(
    Id int NOT NULL PRIMARY KEY, 
    TagID int NOT NULL,
    Tag varchar(255) NOT NULL 
)

CREATE TABLE Jobs (
    Id int NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    CompanyName varchar(255), 
    Title varchar(255), 
    Link varchar(255), 
    TagID int UNIQUE NOT NULL CONSTRAINT FK_TagID FOREIGN KEY (Tags) REFERENCES Tags(TagID) ON DELETE CASCADE ON UPDATE CASCADE,
    PublishedDate DateTime,
    Country varchar(255),
    City varchar(255),
    Description varchar(MAX)
)

我想要实现的示例结构:

工作

|Id, CompanyName, Title,           Link, TagId, PublishedDate, Country, City,     Description|
|1,  Apple,       Senior Engineer, link, 12,    2019-12-13,    USA,     Michigan, Fun Job    |

标签

|Id, TagId, Tag        |
|1,  12,     C++       |
|2,  12,     C#        |
|3,  12,     Javascript|

现在,如果 Jobs.Id 1 被删除,TagId 为 12 的标签中的所有条目都应该被删除。我怎样才能实现这种行为?

现在我得到:

引用表“Tags”中没有与外键“FK_TagID”中的引用列列表匹配的主键或候选键。

标签: sqlsql-server

解决方案


如果你真的想为非主键创建一个外键,它必须是一个对其有唯一约束的列。

来自在线书籍

FOREIGN KEY 约束不必只链接到另一个表中的 PRIMARY KEY 约束;它也可以定义为引用另一个表中唯一约束的列。

CREATE TABLE Tags(
    Id int NOT NULL PRIMARY KEY, 
    TagID int UNIQUE NOT NULL,
    Tag varchar(255) NOT NULL 
)

CREATE TABLE Jobs (
    Id int NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    CompanyName varchar(255), 
    Title varchar(255), 
    Link varchar(255), 
    TagID int UNIQUE NOT NULL CONSTRAINT FK_TagID FOREIGN KEY REFERENCES Tags(TagID) ON DELETE CASCADE ON UPDATE CASCADE,
    PublishedDate DateTime,
    Country varchar(255),
    City varchar(255),
    Description varchar(MAX)
)

推荐阅读