Sql server SQL唯一值与主&;外键

Sql server SQL唯一值与主&;外键,sql-server,foreign-keys,unique,primary-key,Sql Server,Foreign Keys,Unique,Primary Key,我很确定以前有人问过这个问题,但使用SQL,我试图只允许表使用主键和外键具有唯一的值。这听起来可能令人困惑,所以这是我的SQL语句 文件夹表格: CREATE TABLE [dbo].[Folder] ( [FolderID] VARCHAR(50) NOT NULL, [FolderURL] NCHAR(255) NOT NULL, [FolderTag] VARCHAR(50) NOT NULL, PRIMARY KEY CLUSTERED ([Folde

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

文件夹
表格:

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)
);
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]) 
);
扩展
表格:

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)
);
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]
使其具有唯一的值。我首先尝试通过使用这两个值创建主键来实现这一点,然后尝试上面的当前语句

编辑

我没有给出足够的细节来回答我的问题,下面是我想要创建的两个表的布局,以及使用上述方法得到的结果

文件夹
表格:

----------------------------------------------------------
| 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 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
---------------------------------------------------------
扩展
表格:

----------------------------------------------------------
| 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 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
表中的最后两个值

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

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;
extensionid folderid locationurl -- .jpg下载C:/users/test/pictures .png下载C:/users/test/pictures .docx文档C:/users/test/BusinessDocs .mp3 Home C:/users/test/music .jpg Home C:/users/test/pictures .mp3下载C:/users/test/music
下面是完整的代码和输出。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;
extensionid folderid locationurl -- .jpg下载C:/users/test/pictures .png下载C:/users/test/pictures .docx文档C:/users/test/BusinessDocs .mp3 Home C:/users/test/music .jpg Home C:/users/test/pictures .mp3下载C:/users/test/music
为什么不能将两者都转换为主键?这是可以接受的。目前的方法有什么问题?在
FolderID、ExtensionID
上有一个唯一的约束,您不能将重复项存储到该表中。。。。。。所以基本上,这应该完全符合您的要求-不是吗?我认为我也可以接受,但visual studio似乎不接受它,这可能是因为VS,但我不知道。我用于将两者用作主键的语句是:CREATE TABLE[dbo].[Extension]([ExtensionID]VARCHAR(10)NOT NULL,[FolderID]VARCHAR(50)NOT NULL,[LocationURL]VARCHAR(MAX)NOT NULL,主键([ExtensionID],[FolderID]),外键([FolderID])REFERENCES[dbo].[Folder]([FolderID]);但它似乎确实起作用了。您没有回答我的问题:使用当前的方法,在唯一的约束条件下,您仍然能够将重复数据插入表中吗??你不应该……你不应该用这种设计来添加副本。您是否考虑过将PKEY切换到ID字段?FKEY加入非PKey是不常见的。有关详细信息,请参阅此问题:。为什么不能将这两个项都转换为主键?这是可以接受的。目前的方法有什么问题?在
FolderID、ExtensionID
上有一个唯一的约束,您不能将重复项存储到该表中。。。。。。所以基本上,这应该完全符合您的要求-不是吗?我认为我也可以接受,但visual studio似乎不接受它,这可能是因为VS,但我不知道。我用于将两者用作主键的语句是:CREATE TABLE[dbo].[Extension]([ExtensionID]VARCHAR(10)NOT NULL,[FolderID]VARCHAR(50)NOT NULL,[LocationURL]VARCHAR(MAX)NOT NULL,主键([ExtensionID],[FolderID]),外键([FolderID])REFERENCES[dbo].[Folder]([FolderID]);但它似乎确实起作用了。您没有回答我的问题:使用当前的方法,在唯一的约束条件下,您仍然能够将重复数据插入表中吗??你不应该……你不应该用这种设计来添加副本。您是否考虑过将PKEY切换到ID字段?FKEY加入非PKey是不常见的。有关更多信息,请参阅此问题:。似乎没有按照我希望的方式工作。我有点希望我能更好地解释我想要什么。“似乎没有按照我想要的方式工作。”FWIW,这是非常无用的反馈。它的工作原理和你说的一模一样。请参阅其他代码和输出。对于缺少信息感到抱歉,在删除整个数据库并测试您的数据库之后,它也按照我需要的方式工作。谢谢。似乎没有按照我希望的方式工作。我有点希望我能更好地解释我想要什么。“似乎没有按照我想要的方式工作。”FWIW,这是非常无用的反馈。它的工作原理和你说的一模一样。请参阅其他代码和输出。对于缺少信息感到抱歉,在删除整个数据库并测试您的数据库后,它的工作方式符合我的需要,我也非常感谢。