The use of multiple foreign keys on same column in SQL Server Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manaraforeign key constraints on same tableChanging field length when foreign keys reference primary key field in tableNeed for indexes on foreign keysComposite primary key from multiple tables / multiple foreign keysForeign Keys to tables where primary key is not clustered indexWhat would I use a MATCH SIMPLE foreign key for?Multiple foreign keys on single columnSQL Server database design with foreign keysComposite Primary Key on partitioned tables, and Foreign KeysIs it best practice to use surrogate keys when creating foreign key constraints in SQL Server?
Israeli soda type drink
Long vowel quality before R
Suing a Police Officer Instead of the Police Department
What is the best way to deal with NPC-NPC combat?
How to have a sharp product image?
Did the Roman Empire have penal colonies?
What is purpose of DB Browser(dbbrowser.aspx) under admin tool?
Has a Nobel Peace laureate ever been accused of war crimes?
Why doesn't the standard consider a template constructor as a copy constructor?
What does a straight horizontal line above a few notes, after a changed tempo mean?
Is accepting an invalid credit card number a security issue?
Implementing 3DES algorithm in Java: is my code secure?
Crossed out red box fitting tightly around image
How to avoid introduction cliches
How do I reattach a shelf to the wall when it ripped out of the wall?
What is the ongoing value of the Kanban board to the developers as opposed to management
tikz-feynman: edge labels
Why do distances seem to matter in the Foundation world?
Air bladders in bat-like skin wings for better lift?
What's the difference between using dependency injection with a container and using a service locator?
Scheduling based problem
Is Diceware more secure than a long passphrase?
Intern got a job offer for same salary than a long term team member
Is it possible to cast 2x Final Payment while sacrificing just one creature?
The use of multiple foreign keys on same column in SQL Server
Unicorn Meta Zoo #1: Why another podcast?
Announcing the arrival of Valued Associate #679: Cesar Manaraforeign key constraints on same tableChanging field length when foreign keys reference primary key field in tableNeed for indexes on foreign keysComposite primary key from multiple tables / multiple foreign keysForeign Keys to tables where primary key is not clustered indexWhat would I use a MATCH SIMPLE foreign key for?Multiple foreign keys on single columnSQL Server database design with foreign keysComposite Primary Key on partitioned tables, and Foreign KeysIs it best practice to use surrogate keys when creating foreign key constraints in SQL Server?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
SQL Server allows me to create multiple foreign keys on a column, and each time using just different name I can create another key referencing to the same object. Basically all the keys are defining the same relationship. I want to know what's the use of having multiple foreign keys which are defined on the same column and reference to the same column in another table. What's the benefit of it that SQL Server allows us to do a thing like that?
sql-server foreign-key
add a comment |
SQL Server allows me to create multiple foreign keys on a column, and each time using just different name I can create another key referencing to the same object. Basically all the keys are defining the same relationship. I want to know what's the use of having multiple foreign keys which are defined on the same column and reference to the same column in another table. What's the benefit of it that SQL Server allows us to do a thing like that?
sql-server foreign-key
add a comment |
SQL Server allows me to create multiple foreign keys on a column, and each time using just different name I can create another key referencing to the same object. Basically all the keys are defining the same relationship. I want to know what's the use of having multiple foreign keys which are defined on the same column and reference to the same column in another table. What's the benefit of it that SQL Server allows us to do a thing like that?
sql-server foreign-key
SQL Server allows me to create multiple foreign keys on a column, and each time using just different name I can create another key referencing to the same object. Basically all the keys are defining the same relationship. I want to know what's the use of having multiple foreign keys which are defined on the same column and reference to the same column in another table. What's the benefit of it that SQL Server allows us to do a thing like that?
sql-server foreign-key
sql-server foreign-key
asked Apr 6 at 13:49
ElGrigElGrig
770118
770118
add a comment |
add a comment |
5 Answers
5
active
oldest
votes
There is no benefit to having redundant constraints that differ only by name. Similarly, there is no benefit to having redundant indexes that differ only by name. Both add overhead without value.
The SQL Server database engine does not stop you from doing so. Good constraint naming constraint naming conventions (e.g. FK_ReferencingTable_ReferencedTable) can help protect one against such mistakes.
add a comment |
SQL Server allows you to do a lot of silly things.
You can even create a foreign key on a column referencing itself - despite the fact that this can never be violated as every row will meet the constraint on itself.
One edge case where the ability to create two foreign keys on the same relationship would be potentially useful is because the index used for validating foreign keys is determined at creation time. If a better (i.e. narrower) index comes along later then this would allow a new foreign key constraint to be created bound on the better index and then the original constraint dropped without having any gap with no active constraint.
(As in example below)
CREATE TABLE T1(
T1_Id INT PRIMARY KEY CLUSTERED NOT NULL,
Filler CHAR(4000) NULL,
)
INSERT INTO T1 VALUES (1, '');
CREATE TABLE T2(
T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id),
Filler CHAR(4000) NULL,
)
ALTER TABLE T1 ADD CONSTRAINT
UQ_T1 UNIQUE NONCLUSTERED(T1_Id)
/*Execution Plan uses clustered index*/
INSERT INTO T2 VALUES (1,1)
ALTER TABLE T2 WITH CHECK ADD CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)
ALTER TABLE T2 DROP CONSTRAINT FK
/*Now Execution Plan now uses non clustered index*/
INSERT INTO T2 VALUES (1,1)
DROP TABLE T2, T1;
As an aside for the interim period whilst both constraints exist any inserts end up being validated against both indexes.
add a comment |
There is no use for having identical foreign key constraints., that is on same columns and referencing same table and columns.
It's like having the same check 2 or more times.
add a comment |
Same reason you can create 50 indexes on the same column, add a second log file, set max server memory to 20MB... most people won't do these things, but there can be legitimate reasons to do them occasionally, so there's no benefit in creating overhead in the engine to add checks against things that are merely ill-advised.
add a comment |
Sounds like a blue-green thing.
When you begin to cutover from blue to green, you need to temporarily create extra copies of things.
What we want to do is temporarily create an extra foreign key CHECK WITH NOCHECK
and ON UPDATE CASCADE ON DELETE SET NULL
; what this does is it is a working foreign key but the existing rows aren't checked when the key is created.
Later after cleaning up all the rows that should match we would create the new foreign key without any command options (default is CHECK WITH CHECK
which is what you typically want), and drop the temporary foreign key.
Notice that if you just dropped and recreated the foreign key, some garbage rows could slip by you.
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "182"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f234086%2fthe-use-of-multiple-foreign-keys-on-same-column-in-sql-server%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
There is no benefit to having redundant constraints that differ only by name. Similarly, there is no benefit to having redundant indexes that differ only by name. Both add overhead without value.
The SQL Server database engine does not stop you from doing so. Good constraint naming constraint naming conventions (e.g. FK_ReferencingTable_ReferencedTable) can help protect one against such mistakes.
add a comment |
There is no benefit to having redundant constraints that differ only by name. Similarly, there is no benefit to having redundant indexes that differ only by name. Both add overhead without value.
The SQL Server database engine does not stop you from doing so. Good constraint naming constraint naming conventions (e.g. FK_ReferencingTable_ReferencedTable) can help protect one against such mistakes.
add a comment |
There is no benefit to having redundant constraints that differ only by name. Similarly, there is no benefit to having redundant indexes that differ only by name. Both add overhead without value.
The SQL Server database engine does not stop you from doing so. Good constraint naming constraint naming conventions (e.g. FK_ReferencingTable_ReferencedTable) can help protect one against such mistakes.
There is no benefit to having redundant constraints that differ only by name. Similarly, there is no benefit to having redundant indexes that differ only by name. Both add overhead without value.
The SQL Server database engine does not stop you from doing so. Good constraint naming constraint naming conventions (e.g. FK_ReferencingTable_ReferencedTable) can help protect one against such mistakes.
edited Apr 7 at 21:40
answered Apr 6 at 14:27
Dan GuzmanDan Guzman
14.3k21737
14.3k21737
add a comment |
add a comment |
SQL Server allows you to do a lot of silly things.
You can even create a foreign key on a column referencing itself - despite the fact that this can never be violated as every row will meet the constraint on itself.
One edge case where the ability to create two foreign keys on the same relationship would be potentially useful is because the index used for validating foreign keys is determined at creation time. If a better (i.e. narrower) index comes along later then this would allow a new foreign key constraint to be created bound on the better index and then the original constraint dropped without having any gap with no active constraint.
(As in example below)
CREATE TABLE T1(
T1_Id INT PRIMARY KEY CLUSTERED NOT NULL,
Filler CHAR(4000) NULL,
)
INSERT INTO T1 VALUES (1, '');
CREATE TABLE T2(
T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id),
Filler CHAR(4000) NULL,
)
ALTER TABLE T1 ADD CONSTRAINT
UQ_T1 UNIQUE NONCLUSTERED(T1_Id)
/*Execution Plan uses clustered index*/
INSERT INTO T2 VALUES (1,1)
ALTER TABLE T2 WITH CHECK ADD CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)
ALTER TABLE T2 DROP CONSTRAINT FK
/*Now Execution Plan now uses non clustered index*/
INSERT INTO T2 VALUES (1,1)
DROP TABLE T2, T1;
As an aside for the interim period whilst both constraints exist any inserts end up being validated against both indexes.
add a comment |
SQL Server allows you to do a lot of silly things.
You can even create a foreign key on a column referencing itself - despite the fact that this can never be violated as every row will meet the constraint on itself.
One edge case where the ability to create two foreign keys on the same relationship would be potentially useful is because the index used for validating foreign keys is determined at creation time. If a better (i.e. narrower) index comes along later then this would allow a new foreign key constraint to be created bound on the better index and then the original constraint dropped without having any gap with no active constraint.
(As in example below)
CREATE TABLE T1(
T1_Id INT PRIMARY KEY CLUSTERED NOT NULL,
Filler CHAR(4000) NULL,
)
INSERT INTO T1 VALUES (1, '');
CREATE TABLE T2(
T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id),
Filler CHAR(4000) NULL,
)
ALTER TABLE T1 ADD CONSTRAINT
UQ_T1 UNIQUE NONCLUSTERED(T1_Id)
/*Execution Plan uses clustered index*/
INSERT INTO T2 VALUES (1,1)
ALTER TABLE T2 WITH CHECK ADD CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)
ALTER TABLE T2 DROP CONSTRAINT FK
/*Now Execution Plan now uses non clustered index*/
INSERT INTO T2 VALUES (1,1)
DROP TABLE T2, T1;
As an aside for the interim period whilst both constraints exist any inserts end up being validated against both indexes.
add a comment |
SQL Server allows you to do a lot of silly things.
You can even create a foreign key on a column referencing itself - despite the fact that this can never be violated as every row will meet the constraint on itself.
One edge case where the ability to create two foreign keys on the same relationship would be potentially useful is because the index used for validating foreign keys is determined at creation time. If a better (i.e. narrower) index comes along later then this would allow a new foreign key constraint to be created bound on the better index and then the original constraint dropped without having any gap with no active constraint.
(As in example below)
CREATE TABLE T1(
T1_Id INT PRIMARY KEY CLUSTERED NOT NULL,
Filler CHAR(4000) NULL,
)
INSERT INTO T1 VALUES (1, '');
CREATE TABLE T2(
T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id),
Filler CHAR(4000) NULL,
)
ALTER TABLE T1 ADD CONSTRAINT
UQ_T1 UNIQUE NONCLUSTERED(T1_Id)
/*Execution Plan uses clustered index*/
INSERT INTO T2 VALUES (1,1)
ALTER TABLE T2 WITH CHECK ADD CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)
ALTER TABLE T2 DROP CONSTRAINT FK
/*Now Execution Plan now uses non clustered index*/
INSERT INTO T2 VALUES (1,1)
DROP TABLE T2, T1;
As an aside for the interim period whilst both constraints exist any inserts end up being validated against both indexes.
SQL Server allows you to do a lot of silly things.
You can even create a foreign key on a column referencing itself - despite the fact that this can never be violated as every row will meet the constraint on itself.
One edge case where the ability to create two foreign keys on the same relationship would be potentially useful is because the index used for validating foreign keys is determined at creation time. If a better (i.e. narrower) index comes along later then this would allow a new foreign key constraint to be created bound on the better index and then the original constraint dropped without having any gap with no active constraint.
(As in example below)
CREATE TABLE T1(
T1_Id INT PRIMARY KEY CLUSTERED NOT NULL,
Filler CHAR(4000) NULL,
)
INSERT INTO T1 VALUES (1, '');
CREATE TABLE T2(
T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id),
Filler CHAR(4000) NULL,
)
ALTER TABLE T1 ADD CONSTRAINT
UQ_T1 UNIQUE NONCLUSTERED(T1_Id)
/*Execution Plan uses clustered index*/
INSERT INTO T2 VALUES (1,1)
ALTER TABLE T2 WITH CHECK ADD CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)
ALTER TABLE T2 DROP CONSTRAINT FK
/*Now Execution Plan now uses non clustered index*/
INSERT INTO T2 VALUES (1,1)
DROP TABLE T2, T1;
As an aside for the interim period whilst both constraints exist any inserts end up being validated against both indexes.
edited Apr 6 at 19:21
answered Apr 6 at 19:04
Martin SmithMartin Smith
64.7k10175260
64.7k10175260
add a comment |
add a comment |
There is no use for having identical foreign key constraints., that is on same columns and referencing same table and columns.
It's like having the same check 2 or more times.
add a comment |
There is no use for having identical foreign key constraints., that is on same columns and referencing same table and columns.
It's like having the same check 2 or more times.
add a comment |
There is no use for having identical foreign key constraints., that is on same columns and referencing same table and columns.
It's like having the same check 2 or more times.
There is no use for having identical foreign key constraints., that is on same columns and referencing same table and columns.
It's like having the same check 2 or more times.
edited Apr 6 at 14:28
answered Apr 6 at 14:22
ypercubeᵀᴹypercubeᵀᴹ
78.7k11137223
78.7k11137223
add a comment |
add a comment |
Same reason you can create 50 indexes on the same column, add a second log file, set max server memory to 20MB... most people won't do these things, but there can be legitimate reasons to do them occasionally, so there's no benefit in creating overhead in the engine to add checks against things that are merely ill-advised.
add a comment |
Same reason you can create 50 indexes on the same column, add a second log file, set max server memory to 20MB... most people won't do these things, but there can be legitimate reasons to do them occasionally, so there's no benefit in creating overhead in the engine to add checks against things that are merely ill-advised.
add a comment |
Same reason you can create 50 indexes on the same column, add a second log file, set max server memory to 20MB... most people won't do these things, but there can be legitimate reasons to do them occasionally, so there's no benefit in creating overhead in the engine to add checks against things that are merely ill-advised.
Same reason you can create 50 indexes on the same column, add a second log file, set max server memory to 20MB... most people won't do these things, but there can be legitimate reasons to do them occasionally, so there's no benefit in creating overhead in the engine to add checks against things that are merely ill-advised.
answered Apr 6 at 15:51
Aaron Bertrand♦Aaron Bertrand
155k18301497
155k18301497
add a comment |
add a comment |
Sounds like a blue-green thing.
When you begin to cutover from blue to green, you need to temporarily create extra copies of things.
What we want to do is temporarily create an extra foreign key CHECK WITH NOCHECK
and ON UPDATE CASCADE ON DELETE SET NULL
; what this does is it is a working foreign key but the existing rows aren't checked when the key is created.
Later after cleaning up all the rows that should match we would create the new foreign key without any command options (default is CHECK WITH CHECK
which is what you typically want), and drop the temporary foreign key.
Notice that if you just dropped and recreated the foreign key, some garbage rows could slip by you.
add a comment |
Sounds like a blue-green thing.
When you begin to cutover from blue to green, you need to temporarily create extra copies of things.
What we want to do is temporarily create an extra foreign key CHECK WITH NOCHECK
and ON UPDATE CASCADE ON DELETE SET NULL
; what this does is it is a working foreign key but the existing rows aren't checked when the key is created.
Later after cleaning up all the rows that should match we would create the new foreign key without any command options (default is CHECK WITH CHECK
which is what you typically want), and drop the temporary foreign key.
Notice that if you just dropped and recreated the foreign key, some garbage rows could slip by you.
add a comment |
Sounds like a blue-green thing.
When you begin to cutover from blue to green, you need to temporarily create extra copies of things.
What we want to do is temporarily create an extra foreign key CHECK WITH NOCHECK
and ON UPDATE CASCADE ON DELETE SET NULL
; what this does is it is a working foreign key but the existing rows aren't checked when the key is created.
Later after cleaning up all the rows that should match we would create the new foreign key without any command options (default is CHECK WITH CHECK
which is what you typically want), and drop the temporary foreign key.
Notice that if you just dropped and recreated the foreign key, some garbage rows could slip by you.
Sounds like a blue-green thing.
When you begin to cutover from blue to green, you need to temporarily create extra copies of things.
What we want to do is temporarily create an extra foreign key CHECK WITH NOCHECK
and ON UPDATE CASCADE ON DELETE SET NULL
; what this does is it is a working foreign key but the existing rows aren't checked when the key is created.
Later after cleaning up all the rows that should match we would create the new foreign key without any command options (default is CHECK WITH CHECK
which is what you typically want), and drop the temporary foreign key.
Notice that if you just dropped and recreated the foreign key, some garbage rows could slip by you.
answered Apr 7 at 4:01
JoshuaJoshua
1736
1736
add a comment |
add a comment |
Thanks for contributing an answer to Database Administrators Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f234086%2fthe-use-of-multiple-foreign-keys-on-same-column-in-sql-server%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown