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 或其他允许唯一 ExtensionID
和 FolderID
的东西,因此它将允许最后两个值在 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
我很确定以前有人问过这个问题,但使用 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 或其他允许唯一 ExtensionID
和 FolderID
的东西,因此它将允许最后两个值在 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