SQL 具有主键和外键的唯一值

SQL Unique Value With Primary & Foreign Keys

我很确定以前有人问过这个问题,但使用 SQL 我试图只允许 table 使用主键和外键具有唯一值。这听起来可能令人困惑,所以这些是我的 SQL 声明。

Folder table:

CREATE TABLE [dbo].[Folder] 
(
    [FolderID] VARCHAR(50) NOT NULL,
    [FolderURL] NCHAR(255) NOT NULL,
    [FolderTag] VARCHAR(50) NOT NULL,

    PRIMARY KEY CLUSTERED ([FolderURL] ASC),
    UNIQUE NONCLUSTERED ([FolderID] ASC)
);

Extension table:

CREATE TABLE [dbo].[Extension] 
(
    [ExtensionID] VARCHAR(10) NOT NULL,
    [FolderID] VARCHAR(50) NOT NULL,
    [LocationURL] VARCHAR(MAX) NOT NULL,

    PRIMARY KEY CLUSTERED ([ExtensionID] ASC),

    CONSTRAINT [fk_FolderID] 
        FOREIGN KEY ([FolderID])
        REFERENCES [dbo].[Folder]([FolderID]) ON DELETE CASCADE,
    CONSTRAINT uc_Extension UNIQUE ([ExtensionID], [FolderID]) 
);

Extension table 中,我想使用 [FolderID] & [ExtensionID] 使其具有唯一值。我首先尝试通过使用这两个值创建一个主键来实现这一点,然后我尝试了上面的当前语句。

编辑

我没有提供足够的细节来说明我的要求,下面是我想要创建的 table 的布局以及使用上述方法的结果。

Folder Table:

----------------------------------------------------------
| Folder ID |        FolderURL        |  FolderTag       |
|-----------|-------------------------|------------------|
|   Home    | C:/users/test/          | Home Folder      |
| Downloads | E:/Donwloads            | Downloads Folder |
|   Music   | C:/users/test/music     | Music Folder     |
| Documents | C:/users/test/documents | Downloads Folder |
----------------------------------------------------------

Extension Table:

---------------------------------------------------------
| Extension ID | FolderID  |        LocationURL         |
|--------------|-----------|----------------------------|
|    .jpg      | Downloads | C:/users/test/pictures     | = Pass 
|    .png      | Downloads | C:/users/test/pictures     | = Pass
|    .docx     | Documents | C:/users/test/BusinessDocs | = Pass
|    .mp3      |   Home    | C:/users/test/music        | = Pass
|    .jpg      |   Home    | C:/users/test/pictures     | = Fail
|    .mp3      | Downloads | C:/users/test/music        | = Fail
---------------------------------------------------------

从上面提供的 table 布局中,您可以看到最后两个失败,因为 .mp3 ID 已经输入到 table 中。我要问的是创建一个具有唯一主键的 table 或其他允许唯一 ExtensionIDFolderID 的东西,因此它将允许最后两个值在 Extension Table.

如果有人能帮助我,我将不胜感激。

CREATE TABLE [dbo].[Extension] 
(
    [ExtensionID] VARCHAR(10) NOT NULL,
    [FolderID] VARCHAR(50) NOT NULL,
    [LocationURL] VARCHAR(MAX) NOT NULL,

    PRIMARY KEY ([ExtensionID], [FolderID]),

    CONSTRAINT [fk_FolderID] 
        FOREIGN KEY ([FolderID])
        REFERENCES [dbo].[Folder]([FolderID]) ON DELETE CASCADE
);

这是完整的代码和输出。 SQLFiddle.com 对我来说很失望;这是 PostgreSQL 语法。

CREATE TABLE Folder
(
    FolderID VARCHAR(50) NOT NULL,
    FolderURL NCHAR(255) NOT NULL,
    FolderTag VARCHAR(50) NOT NULL,

    PRIMARY KEY (FolderURL),
    UNIQUE (FolderID)
);

CREATE TABLE Extension 
(
    ExtensionID VARCHAR(10) NOT NULL,
    FolderID VARCHAR(50) NOT NULL,
    LocationURL VARCHAR(255) NOT NULL,

    PRIMARY KEY (ExtensionID, FolderID),

    CONSTRAINT fk_FolderID 
        FOREIGN KEY (FolderID)
        REFERENCES Folder(FolderID) ON DELETE CASCADE
);

insert into folder values
('Home', 'C:/users/test/', 'Home Folder'),
('Downloads', 'E:/Donwloads', 'Downloads Folder'),
('Music', 'C:/users/test/music', 'Music Folder'),
('Documents', 'C:/users/test/documents', 'Downloads Folder');

insert into Extension values
('.jpg', 'Downloads', 'C:/users/test/pictures'),
('.png', 'Downloads', 'C:/users/test/pictures'),
('.docx', 'Documents', 'C:/users/test/BusinessDocs'),
('.mp3', 'Home', 'C:/users/test/music'),
('.jpg', 'Home', 'C:/users/test/pictures'),
('.mp3', 'Downloads', 'C:/users/test/music');

select * from folder;
folderid    folderurl                 foldertag
--
Home        C:/users/test/            Home Folder
Downloads   E:/Donwloads              Downloads Folder
Music       C:/users/test/music       Music Folder
Documents   C:/users/test/documents   Downloads Folder
select * from extension;
extensionid  folderid    locationurl
--
.jpg         Downloads   C:/users/test/pictures
.png         Downloads   C:/users/test/pictures
.docx         Documents  C:/users/test/BusinessDocs
.mp3         Home        C:/users/test/music
.jpg         Home        C:/users/test/pictures
.mp3         Downloads   C:/users/test/music