如何创建联结表并添加索引?

Posted

技术标签:

【中文标题】如何创建联结表并添加索引?【英文标题】:How to create a junction table and add index? 【发布时间】:2018-11-04 18:34:30 【问题描述】:

下面是我创建两个表的代码,由于播放列表和歌曲是多对多的关系,我继续创建一个连接表...

CREATE TABLE Playlist (
   Id VARCHAR(20),
   [Name] VARCHAR(50),
   Create_Date DATE,
   Username VARCHAR(20),
   PRIMARY KEY (Id),
   FOREIGN KEY (username) REFERENCES Users (username)
);  

CREATE TABLE Song (
   Id VARCHAR(20),
   Title VARCHAR(50),
   Genre VARCHAR(20),
   [Length] TIME,
   [Language] VARCHAR(20),
   Album_Id VARCHAR(20),
   Company_Id VARCHAR(20),
   PRIMARY KEY (Id),
   FOREIGN KEY (Company_Id) REFERENCES Company (Id),
   FOREIGN KEY (Album_Id) REFERENCES Album (Id)
);

CREATE TABLE Song_Playlist (
   Song_Id VARCHAR(20) NOT NULL,
   Playlist_Id VARCHAR(20) NOT NULL,
   PRIMARY KEY (Song_Id, Playlist_Id), 
   FOREIGN KEY (Song_id) REFERENCES Song (Id) ON DELETE RESTRICT ON UPDATE CASCADE,
   FOREIGN KEY (Playlist_Id) REFERENCES Playlist (Id) ON DELETE RESTRICT ON UPDATE CASCADE  
);

但是,当我尝试创建联结表时,它一直给我这个错误消息:

消息 156,级别 15,状态 1,第 5 行关键字“RESTRICT”附近的语法不正确。

我想知道如何解决这个问题,如果我想在 Song 表中为 Genre 创建索引,我该怎么做?

【问题讨论】:

这看起来不像 mysql。你确定你没有改用 SQL Server 吗? @MadhurBhaiya 我认为这不是 SQL Server,因为 SQL Server 有 [ ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT ] 没有 ON DELETE RESTRICT 是的,我使用的是 SQL 服务器。不知怎的,我打错了... 【参考方案1】:

您似乎正在使用 SQL Server(根据代码和错误消息),但来自 docs online

语法:

| FOREIGN KEY   
    ( column [ ,...n ] )  
    REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
    [ ON DELETE  NO ACTION | CASCADE | SET NULL | SET DEFAULT  ]   
    [ ON UPDATE  NO ACTION | CASCADE | SET NULL | SET DEFAULT  ]   
    [ NOT FOR REPLICATION ] 

删除时 无操作 |级联 |设置空 |默认设置 如果这些行具有引用关系并且引用的行已从父表中删除,则指定对更改的表中的行执行什么操作。默认为无操作。

这就是你收到错误Incorrect syntax near the keyword 'RESTRICT' 的原因,因为SQL Server 没有ON DELETE RESTRICT

【讨论】:

以上是关于如何创建联结表并添加索引?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL创建表的时候如何加“索引”?

如何创建儿童计数的索引视图

创建impala表并使用java添加数据

MYSQL创建表的时候如果加 索引

创建高级联结

创建高级联结