我很确定之前已经问过这个问题,但是使用SQL我试图只允许表使用主键和外键来获得唯一值 . 这可能听起来令人困惑,因此这些是我的SQL语句 .
Folder
表:
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
表:
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
表中,我希望它使用 [FolderID] & [ExtensionID]
具有唯一值 . 我首先尝试通过使用两个值创建主键来实现此目的,然后我尝试了上面的当前语句 .
Edit
我没有提供足够详细的信息,下面是我要创建的两个表的布局以及使用上述方法的结果 .
Folder
表:
----------------------------------------------------------
| 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
表:
---------------------------------------------------------
| 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
---------------------------------------------------------
从上面提供的表格布局中,您可以看到由于.mp3 ID而导致的最后两个失败已经输入到表格中 . 我要问的是创建一个具有唯一主键的表,或其他允许唯一 ExtensionID
和 FolderID
的表,因此它将允许 Extension
表中的最后两个值 .
如果有人能帮助我,我将非常感激 .
1 回答
这是完整的代码和输出 . SQLFiddle.com对我不利;这是PostgreSQL语法 .