T-SQL 中的联结表

Posted

技术标签:

【中文标题】T-SQL 中的联结表【英文标题】:Junction tables in T-SQL 【发布时间】:2010-09-06 15:27:41 【问题描述】:

在我的数据库应用程序中,当我尝试将页面附加到站点时,我收到以下错误:

System.InvalidOperationException: Can't perform Create, Update or Delete operations on 'Table(Junc_Page_Site)' because it has no primary key.

我希望一个页面能够添加到多个站点 - 通过使用联结表。

以下是相关三个表 (T-SQL) 的架构。任何建议将不胜感激!

CREATE TABLE Site (
    Id     INTEGER    NOT NULL IDENTITY ,
    FkSiteId    INTEGER   ,
    Name     NVARCHAR(64)  NOT NULL ,
    Domain     NVARCHAR(128) ,
    Theme     NVARCHAR(32) ,
    ThemeVariation  NVARCHAR(32) ,
PRIMARY KEY(Id) ,
FOREIGN KEY(FkSiteId)
    REFERENCES    Site(Id));
GO



CREATE TABLE Page (
    Id      INTEGER    NOT NULL IDENTITY ,
    Title    NVARCHAR(64)  NOT NULL ,
    Description   NVARCHAR(256)  NOT NULL , 
    Keywords   NVARCHAR(1024)  NOT NULL ,
    ScriptName   NVARCHAR(64) , 
PRIMARY KEY(Id));
GO



CREATE TABLE Junc_Page_Site (
    FkPageId   INTEGER     NOT NULL ,
    FkSiteId   INTEGER    NOT NULL  ,
FOREIGN KEY(FkSiteId)
    REFERENCES Site(Id),
FOREIGN KEY(FkPageId)
    REFERENCES Page(Id));
GO

【问题讨论】:

【参考方案1】:

你快到了。你只需要创建一个所谓的“复合主键”,也就是说你需要告诉数据库FkPageId和FkSiteId的组合是唯一的:

CREATE TABLE Junc_Page_Site (
    FkPageId INTEGER NOT NULL ,
    FkSiteId INTEGER NOT NULL  ,
FOREIGN KEY(FkSiteId)
    REFERENCES Site(Id),
FOREIGN KEY(FkPageId)
    REFERENCES Page(Id),
PRIMARY KEY (FkPageId, FkSiteId));

【讨论】:

以上是关于T-SQL 中的联结表的主要内容,如果未能解决你的问题,请参考以下文章

联结表

联结表中的复合主键 - Sequelize

查询表中的所有数据,仅连接联结表中的最新记录

有啥方法可以自动将新行添加到 sql 中的联结表中?

将所有记录插入到 Symfony 中的联结表中

通过匹配链接表中的值来填充联结表