Sql server SQL唯一值与主&;外键
我很确定以前有人问过这个问题,但使用SQL,我试图只允许表使用主键和外键具有唯一的值。这听起来可能令人困惑,所以这是我的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
文件夹
表格:
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,这是非常无用的反馈。它的工作原理和你说的一模一样。请参阅其他代码和输出。对于缺少信息感到抱歉,在删除整个数据库并测试您的数据库后,它的工作方式符合我的需要,我也非常感谢。