MySQL හි බහු තීරු සඳහා අද්විතීය බාධකයක් මා සඳහන් කරන්නේ කෙසේද?


883

මට මේසයක් තිබේ:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);

දැන් මට තීරු පරිශීලක, ඊමේල්, ලිපිනය අද්විතීය (එකට) කිරීමට අවශ්‍යයි .

MySQL හි මෙය කරන්නේ කෙසේද?

ඇත්ත වශයෙන්ම උදාහරණය නිකම්ම ... උදාහරණයක්. එබැවින් කරුණාකර අර්ථ නිරූපණය ගැන කරදර නොවන්න.

Answers:


1475
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);

33
INSERT ප්‍රකාශවල ON DUPLICATE KEY වගන්තිය සමඟ මෙය නිසි ලෙස ක්‍රියාත්මක වේද? එනම්, මම වෙනත් පේළියක පරිශීලක / ඊමේල් / ලිපින අගයන් සමඟ ගැටෙන පේළියක් ඇතුළු කිරීමට උත්සාහ කරන්නේ නම්, ඒ වෙනුවට ON DUPLICATE KEY වගන්තිය මගින් නියම කර ඇති ක්‍රියා INSERT විසින් කරනු ඇත්ද?
clizzin

6
ඒ ආකාරයෙන් තුනක සංයෝජනය අද්විතීය වනු ඇත? නැතහොත් තනි තීරු තුනම අද්විතීයද?
ගැරී ලින්ඩාල්

99
MySQL වැඩ බංකුව භාවිතා කරන පුද්ගලයින් සඳහා: දර්ශක පටිත්ත වෙත ගොස් ඔබේ වර්ගය ලෙස UNIQUE තෝරන්න. ඔබේ දර්ශකයට නමක් ලබා දී "දර්ශක තීරු"
පක්මන්

10
මා මෙන්ම, වෙනත් අයෙකු මෙය සෙවුම් යන්ත්‍රවලින් සොයාගත්තේ නම් ... සහ ක්ලින්සින්ගේ ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා ON DUPLICATE KEY සංයුක්ත යතුරක් සමඟ ක්‍රියා කරයිද - එය නියත වශයෙන්ම එසේ වනු ඇත, කෙසේ වෙතත් එයට වාක්‍ය ඛණ්ඩයට සුළු වෙනස් කිරීම් අවශ්‍ය වේ. stackoverflow.com/questions/9537710/…
ජෝ

2
NULL අගය සමඟ පවා එය ක්‍රියා කරන්නේ කෙසේද. අපි NULL අගය සහිත එකම පේළි දෙකක් ඇතුළත් කළහොත් මෙය ක්‍රියා නොකරයි ...
වසීම් ඒ.

242

මට MySQL වගුවක් ඇත:

CREATE TABLE `content_html` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_box_elements` int(11) DEFAULT NULL,
  `id_router` int(11) DEFAULT NULL,
  `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);

සහ UNIQUE KEY අපේක්ෂා කළ ආකාරයටම ක්‍රියා කරයි, එය id_box_elements සහ id_router පේළි ගණනකට ඉඩ දෙයි.

මම MySQL 5.1.42 ධාවනය කරමි, එබැවින් බොහෝ විට ඉහත සාකච්ඡා කළ ගැටලුව පිළිබඳ යම් යාවත්කාලීනයක් තිබෙන්නට ඇත. වාසනාවකට මෙන් එය ක්‍රියාත්මක වන අතර එය එලෙසම පවතිනු ඇතැයි අපේක්ෂා කරමු.


37
අද්විතීය දර්ශකයක් සහිත නව වගුවක් සාදා ගන්නේ කෙසේද යන්න පෙන්වන බැවින් මෙම පිළිතුර සලකුණු කිරීමට මට අවශ්‍ය වූ අතර ඉහත ජොන්ස්ට්ජෝන්ගේ පිළිතුර ඉහත වගුවක් යාවත්කාලීන කරන්නේ කෙසේදැයි ඔබට කියයි. ඔබ නව වගුවක් නිර්මාණය කරන්නේද නැතහොත් පවතින එකක් යාවත්කාලීන කරන්නේද යන්න මත රඳා පවතී. :)
GazB

3
සියලු පසුබිම්වල ඇති දේ, ඒවා කිසියම් අරමුණක් ඉටු කරයිද?
puk

8
එය පරිපාලක (www.adminer.org) වෙතින් ප්‍රතිදානය වන අතර එමඟින් මෙම පසුබිම් ස්වයංක්‍රීයව ඇතුළත් වේ, එබැවින් තීරු නම් ලෙස භාවිතා කරන MySQL මූල පද ගැටීමෙන් ගැටළුවක් නොමැත.
ෆ්‍රොඩික්

52

MySQL විසින් NULL අද්විතීය අගයක් ලෙස සලකන අතර අවම වශයෙන් දැනට බහු තීරු දර්ශකවල එය වටා වැඩ කිරීමට කිසිදු තර්කයක් නොමැති බැවින් ඔබට පේළියේ NULL අගයක් තිබේ නම් බහු තීරු අද්විතීය දර්ශක MySQL හි ක්‍රියා නොකරයි. ඔව්, හැසිරීම උමතු ය, මන්ද එය බහු තීරු දර්ශක වල නීත්‍යානුකූල යෙදුම් රාශියක් සීමා කරයි, නමුත් එය එයයි ... තවමත්, එය MySQL හි "නිවැරදි නොකරනු ඇත" යනුවෙන් මුද්‍රණය කර ඇති දෝෂයකි. දෝෂ පථය ...


11
පැහැදිලි කිරීමේ කරුණු දෙකක්: 1) මෙම හැසිරීම නොපවතින ENGINE BDBඅතර, 2) මෙය ලේඛනගත හැසිරීමකි, කෙසේ වෙතත්, IMHO, එය කෙතරම් පුදුම සහගත / අප්‍රසන්න විය හැකිද යන්න පිළිබඳව ප්‍රමාණවත් ලෙස ලේඛනගත කර නොමැත. සාකච්ඡාවක් සඳහා MySQL දෝෂ 25544 bugs.mysql.com/bug.php?id=25544 බලන්න .
නියමුවා

2
එන්.යූ.එල්.එල් හි ප්‍රධානියාට ස්තූතියි, මා මුහුණ දුන් ගැටලුව
විසඳුවා

නිල ලියකියවිලි පවසන්නේ: MySQL 5.1 වන විට BDB තවදුරටත් සහාය නොදක්වන බව සලකන්න.
ජෝර්ජ් ඩී.

මෙම උමතු හැසිරීම ඇයි?
cubesnyc

23

ඔබ මෙය උත්සාහ කර තිබේද?

UNIQUE KEY `thekey` (`user`,`email`,`address`)

: කුමක්ද එරික් පමණක් යහපත් ක්රියා මට පැවසීය UNIQUE KEY thekey` ( user, email, address) '. මම භාවිතා කරන්නේ MYSQL අනුවාදය 5.5.24 ඔබ මෙය භාවිතා කරන්නේ නම් PHPMYADMIN හි පවා මෙය සැකසිය හැකිය. මම PMA හි 3.5.1 අනුවාදය භාවිතා කරමි.
WQC

MySQL 5.6 සමඟ එය උත්සාහ කළා. පළමු උත්සාහයෙන් ක්‍රියාත්මක වේ. ස්තූතියි එරික්!
ලෝරන්ස්

12

මෙය mysql අනුවාදය 5.5.32 සඳහා ක්‍රියා කරයි

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);

1
තීරුවේ නමෙහි තනි උපුටා දැක්වීම් නොමැතිව එය ක්‍රියා කරන බව පෙනේ.
ප්‍රතික් සිංගල්

7

MySQL 5 හෝ ඊට වැඩි හැසිරීම් මේ ආකාරයට හැසිරේ (මම දැන් පරීක්ෂා කර ඇත්තෙමි):

  • ශුන්‍ය කළ හැකි තීරු සම්බන්ධ අද්විතීය සීමාවන් ඔබට අර්ථ දැක්විය හැකිය. A අවලංගු නොවන නමුත් B වන අද්විතීය (A, B) අවහිරතා නිර්වචනය කරන්න
  • එවැනි අවහිරතා තක්සේරු කිරීමේදී ඔබට අවශ්‍ය වාර ගණනක් (A, null) තිබිය හැකිය (එකම අගයක්!)
  • ඔබට තිබිය හැක්කේ එක් (A, ශුන්‍ය B) යුගලයක් පමණි

උදාහරණය: PRODUCT_NAME, PRODUCT_VERSION 'වීදුරු', ශුන්‍ය 'වීදුරු', ශුන්‍ය 'වයින්', 1

දැන් ඔබ ('වයින්' 1) නැවත ඇතුල් කිරීමට උත්සාහ කළහොත් එය අවහිරතා උල්ලං report නය කිරීමක් වාර්තා කරනු ඇත


පැහැදිලි කිරීම ගැන ස්තූතියි. මට අද්විතීය (A, B, C) ඇති අතර එය ශුන්‍ය නොවන විකල්පයන් සමඟ ශුන්‍ය සංයෝජනයන්ට ඉඩ දුන්නේ මන්දැයි මම නොදනිමි
ඇලෙක්සැන්ඩ්‍රු ටොපෝල්

6

ඔබට phpMyAdmin හරහා බහු තීරු අද්විතීය දර්ශක එක් කළ හැකිය . (මම 4.0.4 අනුවාදයෙන් පරීක්ෂා කළෙමි)

ඔබගේ ඉලක්ක වගුව සඳහා ව්‍යුහ පිටුවට සංචාලනය කරන්න. එක් තීරුවකට අද්විතීය දර්ශකයක් එක් කරන්න. ඔබ දැන් එකතු කළ අද්විතීය දර්ශකය බැලීමට ව්‍යුහ පිටුවේ පතුලේ ඇති දර්ශක ලැයිස්තුව පුළුල් කරන්න . සංස්කරණ නිරූපකය ක්ලික් කරන්න, පහත සංවාදයෙන් ඔබට එම අද්විතීය දර්ශකයට අමතර තීරු එක් කළ හැකිය.


4

මම එය මේ ආකාරයට කරනවා:

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);

සුවිශේෂී සඳහා මගේ සමුළුව index_nameකියන්නේ TableName_Column1_Column2_Column3_uindex.


3

අද්විතීය දර්ශක එකතු කිරීම සඳහා පහත සඳහන් දෑ අවශ්‍ය වේ:

1) table_name
2) index_name
3) ඔබට දර්ශකය එක් කිරීමට අවශ්‍ය තීරු

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);

ඔබගේ නඩුවේදී අපට පහත පරිදි අද්විතීය දර්ශකය නිර්මාණය කළ හැකිය:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);

3

ඔබ mysql හි වගුවක් සාදන්නේ නම් පහත සඳහන් දෑ භාවිතා කරන්න:

create table package_template_mapping (
mapping_id  int(10) not null auto_increment  ,
template_id int(10) NOT NULL ,
package_id  int(10) NOT NULL ,
remark      varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);

2

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

UPDATE tablename SET id2 = id;

දැන් තීරු දෙකක අද්විතීය එකතු කරන්න:

alter table tablename add unique index(columnname, id2);

0

පළමුව පවතින අනුපිටපත් ඉවත් කරන්න

delete a from votes as a, votes as b where a.id < b.id 
and a.user <=> b.user and a.email <=> b.email 
and a.address <=> b.address;

ඉන්පසු අද්විතීය අවහිරතා එකතු කරන්න

ALTER TABLE votes ADD UNIQUE unique_index(user, email, address);

සමඟ අවහිරතා සත්‍යාපනය කරන්න

SHOW CREATE TABLE votes;

පරිශීලකයා, විද්‍යුත් තැපෑල, ලිපිනය එහි කිසියම් ශුන්‍ය වටිනාකමක් තිබේ නම් එය අද්විතීය ලෙස සලකනු ඇති බව සලකන්න.


0

PostgreSQL සඳහා ... එය දර්ශකය සමඟ මට වැඩ කළේ නැත; එය මට දෝෂයක් ඇති කළ නිසා මම මෙය කළෙමි:

alter table table_name
add unique(column_name_1,column_name_2);

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


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.