අද්විතීය දර්ශකයක් වෙනුවට අද්විතීය බාධකයක් භාවිතා කළ යුත්තේ කවදාද?


212

තීරුවකට වෙනස් අගයන් තිබිය යුතු විට, මට අවහිරයක් භාවිතා කළ හැකිය

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go

හෝ මට අද්විතීය දර්ශකයක් භාවිතා කළ හැකිය

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);

අද්විතීය සීමාවන් සහිත තීරු අද්විතීය දර්ශක සඳහා හොඳ අපේක්ෂකයින් ලෙස පෙනේ.

අද්විතීය සීමාවන් භාවිතා කිරීමට සහ ඒ වෙනුවට අද්විතීය දර්ශක භාවිතා නොකිරීමට දන්නා හේතු තිබේද?


12
ඒවා ඇත්ත වශයෙන්ම වෙනස්ද? මම හිතන්නේ සමහර දත්ත සමුදායන්හි උදා: postgresql, අද්විතීය බාධකයක් හුදෙක් අද්විතීය දර්ශකයක් නිර්මාණය කරයි. මම SQL සේවාදායකය ගැන කිසිවක් නොදන්නා නිසා මම පිළිතුරු නොදෙමි.
xenoterracide

6
postgresql හි, ඔබට අද්විතීය දර්ශකයක ප්‍රකාශනයක් භාවිතා කළ හැකි නමුත් අද්විතීය සීමාවකින් නොවේ.
නීල් මැක්ගුගන්

2
MS SQL හි, ඒවා ක්‍රියාත්මක වන්නේ ද එයමය. එකම දත්ත සහිත වගු දෙකක් නිර්මාණය කිරීමට උත්සාහ කරන්න, එකක් අද්විතීය බාධකයක් සහිතව, අනෙක අද්විතීය දර්ශකයක් සහිතව. ඔවුන් එකම දර්ශක ඉඩ ප්‍රමාණයක් භාවිතා කරනු ඇති අතර, දෙකටම (ප්‍රායෝගිකව) නිර්මාණය කරන ලද අද්විතීය දර්ශකයට එරෙහිව සෙවීමට හැකි වේ.
ජෝන් ඔෆ් ඔල් ට්‍රේඩ්ස්

Answers:


168

කබාය යටතේ අද්විතීය සීමාවක් අද්විතීය දර්ශකයක් සේම ක්‍රියාත්මක වේ - අවහිරතා බලාත්මක කිරීමේ අවශ්‍යතාවය කාර්යක්ෂමව ඉටු කිරීම සඳහා දර්ශකයක් අවශ්‍ය වේ. දර්ශකය නිර්මාණය කර ඇත්තේ UNIQUE අවහිරතාවයේ ප්‍රති as ලයක් ලෙස වුවද, විමසුම් සැළසුම්කරුට එය වෙනත් විමසුමක් මෙන් භාවිතා කළ හැකිය.

එබැවින් විශේෂාංග දෙකටම සහය දක්වන දත්ත සමුදායක් සඳහා කුමන තේරීම භාවිතා කළ යුතුද යන්න බොහෝ විට කැමති ශෛලිය හා අනුකූලතාවයට පැමිණේ.

ඔබ දර්ශකය දර්ශකයක් ලෙස භාවිතා කිරීමට අදහස් කරන්නේ නම් (එනම් ඔබේ කේතය ඉක්මන් වීමට එම ක්ෂේත්‍රයේ සෙවීම / වර්ග කිරීම / පෙරීම මත රඳා පවතී) මම එය පැහැදිලිවම බාධකයක් නොව අද්විතීය දර්ශකයක් භාවිතා කරමි (සහ මූලාශ්‍රය අදහස් දක්වන්න) පැහැදිලි - මේ ආකාරයෙන් පසුව යෙදුම සංශෝධනය කිරීමේදී අද්විතීය අවශ්‍යතාවය වෙනස් වුවහොත් අද්විතීය එකක් වෙනුවට අද්විතීය නොවන දර්ශකයක් තබා ඇති බව තහවුරු කර ගැනීමට ඔබ (හෝ වෙනත් කෝඩරයක්) දැන ගනු ඇත (අද්විතීය බාධකයක් ඉවත් කිරීමෙන් පමණක් ඉවත් වේ දර්ශකය සම්පූර්ණයෙන්ම). නිශ්චිත දර්ශකයක් දර්ශක ඉඟියක (එනම් WITH (INDEX (ix_index_name)) නම් කළ හැකිය, එය අනන්‍යතාවය කළමනාකරණය කිරීම සඳහා තිරය පිටුපස නිර්මාණය කරන ලද දර්ශකය එහි නම දැන ගැනීමට අපහසු බැවින් මම නොසිතමි.

එලෙසම ඔබට අවශ්‍ය වන්නේ ක්ෂේත්‍රය සෙවීමට හෝ වර්ග කිරීම සඳහා භාවිතා කිරීමට වඩා ව්‍යාපාර රීතියක් ලෙස අද්විතීයභාවය බලාත්මක කිරීමට නම්, මම ඔබේ සීමාව අර්ථ දක්වනුයේ වෙනත් අයෙකු ඔබේ වගු අර්ථ දැක්වීම දෙස බලන විට අපේක්ෂිත භාවිතය වඩාත් පැහැදිලිව දැක්වීමට ය.

ඔබ එකම ක්‍ෂේත්‍රයක අද්විතීය බාධකයක් සහ අද්විතීය දර්ශකයක් යන දෙකම භාවිතා කරන්නේ නම්, දත්ත සමුදාය අනුපිටපත බැලීමට තරම් දීප්තිමත් නොවනු ඇත, එබැවින් ඔබ දර්ශක දෙකකින් අවසන් වන අතර එමඟින් අමතර ඉඩ ප්‍රමාණයක් වැය වන අතර පේළි ඇතුළු කිරීම් / යාවත්කාලීන කිරීම් මන්දගාමී වේ.


1
මම කල්පනා කරන්නේ "දත්ත සමුදාය ප්‍රමාණවත් තරම් දීප්තිමත් නොවනු ඇත" යන්න ගැනද? සියලුම RDBMS සඳහා එය සත්‍යයක්ද? එය SQL-Standard විසින් නියම කර තිබේද? එය එසේ වුවත් (එය එසේ විය යුත්තේ මන්දැයි මම කල්පනා කරමි), සියලු ක්‍රියාත්මක කිරීම් එය එසේ ක්‍රියාත්මක කරන්නේද? හෝ: ඩීබී ප්‍රමාණවත් තරම් දීප්තිමත් නොවන්නේ ඇයි?
ජෝගන් ඒ. අර්හාර්ඩ්

4
@jae: ඩීබීඑම්එස් නිසැකවම දීප්තිමත් විය හැකි නමුත් එය තිබේදැයි බැලීමට ඔබ එක් එක් ඩීබීඑම්එස් සමඟ පරීක්ෂා කළ යුතුය. ඔබ සමාන දර්ශක දෙකක් සෑදීමට MSSQL වෙතින් ඉල්ලා සිටියහොත් එය නම් දෙකකින් සඳහන් කරන ලද එකකට වඩා දෙකක් නිර්මාණය කරයි (අවම වශයෙන් මා එවැනි තත්වයක් දුටු අවසාන අවස්ථාව මෙයයි (මගේ පැත්තෙන් පිටපත් + පේස්ට් දෝෂයක් හේතුවෙන්), එබැවින් යම් දර්ශකයක් යම් බාධාවක් හේතුවෙන් තිබේ නම් එය එසේම වේ යැයි මම සිතමි.
ඩේවිඩ් ස්පිලට්

3
+1 av ඩේවිඩ් ස්පිලට් මම හිතන්නේ මූලික වශයෙන් ඩීබීඑම්එස් උපකල්පනය කරන්නේ ඔබ කරන්නේ කුමක්දැයි ඔබ දන්නා බවයි; එකම දර්ශකය දෙවරක් නිර්මාණය කිරීමට ඔබට හැඟේ නම්, එය ඔබෙන් ප්‍රශ්න නොකරයි.
ඇන්ඩ rew බාබර්

2
ඉතා තීක්ෂ්ණ බුද්ධිමත්. මෙම හැසිරීම MySQL සහ Apache Derby වලද තිබේදැයි ඔබ දැන ගන්නවාද?
corsiKa

6
ඔබට අවහිරයක් නම් කළ හැකි අතර එය දර්ශක ඉඟියක භාවිතා කළ හැකිය . CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1. INCLUDED තීරු හෝ පෙරහන් කළ දර්ශක වැනි සියලු දර්ශක විකල්පයන්ට එම සීමාවන් සහාය නොදක්වන නමුත් දර්ශක වඩාත් නම්‍යශීලී විය හැකිය .
මාටින් ස්මිත්

110

වෙනත් පිළිතුරු වල ඇති කරුණු වලට අමතරව, දෙක අතර ප්‍රධාන වෙනස්කම් කිහිපයක් මෙන්න.

සටහන: දෝෂ පණිවිඩ SQL Server 2012 වෙතින්.

දෝෂ

අද්විතීය බාධකයක් උල්ලං lation නය කිරීම මඟින් දෝෂය 2627 වේ.

Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'P1U_pk'. Cannot insert duplicate key in object 'dbo.P1U'. The duplicate key value is (1).
The statement has been terminated.

අද්විතීය දර්ශක උල්ලං lation නය කිරීමේ දෝෂය 2601.

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.P1' with unique index 'P1_u'. The duplicate key value is (1).
The statement has been terminated.

අක්‍රීය කිරීම

අද්විතීය බාධකයක් අබල කළ නොහැක.

Msg 11415, Level 16, State 1, Line 1
Object 'P1U_pk' cannot be disabled or enabled. This action applies only to foreign key and check constraints.
Msg 4916, Level 16, State 0, Line 1
Could not enable or disable the constraint. See previous errors.

නමුත් ඕනෑම අද්විතීය දර්ශකයකට මෙන් ප්‍රාථමික යතුරු අවහිරයක් හෝ අද්විතීය බාධකයක් පිටුපස ඇති අද්විතීය දර්ශකය අක්‍රීය කළ හැකිය. තොප්පි මොළය 2000.

ALTER INDEX P1_u ON dbo.P1 DISABLE ;

පොකුරු දර්ශකයක් අක්‍රීය කිරීමෙන් දත්ත ප්‍රවේශ කළ නොහැකි බවට සුපුරුදු අනතුරු ඇඟවීම සැලකිල්ලට ගන්න.

විකල්ප

අද්විතීය සීමාවන් වැනි විකල්ප හදුනාගැනිමේ සහයෝගය FILLFACTORහා IGNORE_DUP_KEYමෙම SQL Server සෑම අනුවාද සඳහා නඩුව වී නැති අතර ඒ.

ඇතුළත් තීරු

නොකැඩූ දර්ශකවලට සුචිගත නොකළ තීරු ඇතුළත් කළ හැකිය (ආවරණ දර්ශකය ලෙස හැඳින්වේ, මෙය ප්‍රධාන කාර්ය සාධනය වැඩි කිරීමකි). PRIMARY KEY සහ UNIQUE අවහිරතා පිටුපස ඇති දර්ශකවලට තීරු ඇතුළත් කළ නොහැක. තොප්පි ඉඟිය @ypercube.

පෙරීම

අද්විතීය බාධකයක් පෙරීම කළ නොහැක.

අද්විතීය දර්ශකයක් පෙරීම කළ හැකිය.

CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u 
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;

විදේශීය යතුරු අවහිරතා

පෙරහන් නොකළ අද්විතීය දර්ශකයක් යොමු කළ හැකි වුවද, විදේශීය යතුරු සීමාවකට පෙරහන් කළ අද්විතීය දර්ශකයක් සඳහන් කළ නොහැක (මෙය SQL සේවාදායක 2005 හි එකතු කරන ලද්දක් යැයි මම සිතමි).

නම් කිරීම

අවහිරතා නිර්මාණය කිරීමේදී, අවහිරතා නමක් සඳහන් කිරීම අත්‍යවශ්‍ය නොවේ (සියලු වර්ග පහ සඳහා). ඔබ නමක් සඳහන් නොකරන්නේ නම් MSSQL ඔබ වෙනුවෙන් එකක් ජනනය කරනු ඇත.

CREATE TABLE dbo.T1 (
    TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
    TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;

දර්ශක නිර්මාණය කිරීමේදී, ඔබ නමක් සඳහන් කළ යුතුය.

තොප්පි ඉඟිය @ i-one.

සබැඳි

http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx

http://technet.microsoft.com/en-us/library/ms177456.aspx


අද්විතීය අවහිරයක් අක්‍රීය කර දර්ශකයක් ලෙසම සක්‍රීය කළ හැකිය: ALTER INDEX tbl on uconstraint අක්‍රීය, ALTER INDEX tbl ON uconstraint REBUILD
Brain2000

ස්තූතියි @ Brain2000. අහම්බෙන්, මම මෙම අදහස කියවීමට පෙර අද උදෑසන දර්ශක අක්‍රීය කිරීම පිළිබඳ කොටසක් ඉගැන්වූවෙමි.
ග්‍රීන්ස්ටන් වෝකර්

11

MSDN බලයලත් ප්‍රභවයක් ලෙස උපුටා දැක්වීමට:

UNIQUE අවහිරයක් නිර්මාණය කිරීම සහ අවහිරතාවයකින් ස්වාධීන අද්විතීය දර්ශකයක් නිර්මාණය කිරීම අතර සැලකිය යුතු වෙනස්කම් නොමැත . දත්ත වලංගු කිරීම එකම ආකාරයකින් සිදු වන අතර, විමසුම් ප්‍රශස්තකරණය බාධකයක් මගින් හෝ අතින් සාදන ලද අද්විතීය දර්ශකයක් අතර වෙනස හඳුනා නොගනී. කෙසේ වෙතත්, තීරුවේ UNIQUE අවහිරයක් නිර්මාණය කිරීමෙන් දර්ශකයේ පරමාර්ථය පැහැදිලි වේ ... වැඩි විස්තර මෙහි

හා...

දත්ත සමුදා එන්ජිම ස්වයංක්‍රීයව UNIQUE දර්ශකය නිර්මාණය කරන්නේ UNIQUE අවහිරතාවයේ සුවිශේෂී අවශ්‍යතාවය බලාත්මක කිරීම සඳහා ය. එබැවින්, අනුපිටපත් පේළියක් ඇතුළු කිරීමට උත්සාහයක් දරන්නේ නම්, දත්ත සමුදා එන්ජිම මඟින් යුනික් අවහිරතා උල්ලං has නය වී ඇති බවත්, පේළිය මේසය වෙත එක් නොකරන බවත් සඳහන් දෝෂ පණිවිඩයක් යවයි. පොකුරු දර්ශකයක් නිශ්චිතව දක්වා නොමැති නම්, අද්විතීය අවහිරතා බලාත්මක කිරීම සඳහා පෙරනිමියෙන් අද්විතීය, නොකැඩූ දර්ශකයක් නිර්මාණය වේ ... වැඩි විස්තර මෙහි

වෙනත් ඒවාට: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx


7

අද්විතීය බාධකයක් සහ අද්විතීය දර්ශකයක් අතර ඇති එක් ප්‍රධාන වෙනසක් නම්, වෙනත් වගුවක ඇති විදේශීය යතුරු බාධකයකට අද්විතීය බාධකයක් ඇති තීරු යොමු කළ හැකි වීමයි. අද්විතීය දර්ශක සඳහා මෙය සත්‍ය නොවේ. ඊට අමතරව, අද්විතීය සීමාවන් ANSI ප්‍රමිතියේ කොටසක් ලෙස අර්ථ දක්වා ඇති අතර දර්ශක එසේ නොවේ. අවසාන වශයෙන්, තාර්කික දත්ත සමුදා සැලසුම්කරණයේ (විවිධ ඩීබී එන්ජින් විසින් වෙනස් ආකාරයකින් ක්‍රියාත්මක කළ හැකි) ජීවත් වීමට සැලකීමේදී අද්විතීය බාධකයක් වන අතර දර්ශකය භෞතික අංගයකි. එබැවින් අද්විතීය අවහිරතා වඩාත් ප්රකාශිත වේ. සෑම අවස්ථාවකම පාහේ අද්විතීය බාධක වලට මම කැමතියි.


9
-1 SQL සේවාදායකයේ පහත සඳහන් දේ වැරදියි: "වෙනත් වගුවක ඇති විදේශීය යතුරු බාධකයකට අද්විතීය බාධකයක් ඇති තීරු සඳහන් කළ හැකිය. අද්විතීය දර්ශක සඳහා මෙය සත්‍ය නොවේ". SQL සේවාදායකයේ, අපට අද්විතීය දර්ශක වෙත FK අවහිරතා යොමු කළ හැකිය.
ඒකේ

4
අද්විතීය දර්ශකයක් යොමු කිරීම සඳහා විදේශීය යතුරු බාධකයකට ඇති හැකියාව, SQL සේවාදායක 2005 හි එකතු කරන ලද්දක් යැයි මම සිතමි. BOL හි සමහර පිටු ද ඇතුළුව බොහෝ ප්‍රභවයන් වෙනස්කම් පිළිබිඹු වන පරිදි යාවත්කාලීන කර නැත, එබැවින් දිමිත්‍රිගේ පිළිතුර මම නොසිතමි පහත වැටීමට සුදුසුයි. ඔහුගේ ඉතිරි පිළිතුර ස්ථානගතව ඇත - සීමාවන් ANSI- ප්‍රමිතියකි, දර්ශක එසේ නොවේ.
ග්‍රීන්ස්ටන් වෝකර්

ප්‍රමිති වැදගත් ය. අන්සි ප්‍රමිතීන් අද්විතීය බාධකයක් භාවිතා කිරීමට නම්, අප භාවිතා කළ යුත්තේ අද්විතීය සීමාවකි.
රියාස්

1

ඔරකල්හි ප්‍රධාන වෙනසක් වන්නේ ඔබට ක්‍රියාකාරී-අද්විතීය දර්ශකයක් නිර්මාණය කළ හැකි අතර එය අද්විතීය සීමාවන් සමඟ කළ නොහැකි ය:

උදාහරණයක් වශයෙන්

create unique index ux_test on my_table (case when amount != 0 then fk_xyz end);

එබැවින් fk_xyzඅද්විතීය වන්නේ වාර්තා ඇති සුවිශේෂී ඒවා පමණි amount != 0.


8
SQL සේවාදායකයේ (ප්‍රශ්නයේ ටැගය), දර්ශක WHEREවගන්තියකින් පෙරහන් කළ හැකිය . CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
ග්‍රීන්ස්ටන් වෝකර්

-3

UNIQUE දර්ශකය UNIQUE දර්ශකයට වඩා කැමති වේ. අවහිරතා අද්විතීය නොවන විට ඔබ නිත්‍ය හෝ අද්විතීය නොවන දර්ශකයක් භාවිතා කළ යුතුය. අවහිරතා තවත් දර්ශක වර්ගයකි. වේගවත් ප්‍රවේශය සඳහා දර්ශකය භාවිතා කරයි.

අද්විතීය දර්ශක වල වගන්ති තිබිය හැක. උදාහරණයක් ලෙස, දින තීරුව මත පදනම්ව ඔබට සෑම වසරකම දර්ශක සෑදිය හැකිය

WHERE Sale_Date BETWEEN '2012-01-01' AND '2012-12-31'

3
"අවහිරතා තවත් දර්ශකයකි." නැහැ, එසේ නොවේ. සමහර අවහිරතා (PK, UQ, FK) විය හැකි අතර බොහෝ විට එය ක්‍රියාත්මක කරනු ලබන්නේ දර්ශක භාවිතයෙනි. සියලුම ඩීබීඑම්එස් හි පෙරනිමියෙන් නොව අනිවාර්යයෙන්ම නොවේ.
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.