मैं MySQL में कई कॉलमों के लिए अद्वितीय बाधा कैसे निर्दिष्ट करूं?


864

मेरे पास एक टेबल है:

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

अब मैं कॉलम यूजर, ईमेल, एड्रेस यूनिक (एक साथ) बनाना चाहता हूं ।

मैं MySql में यह कैसे करूँ?

बेशक उदाहरण सिर्फ ... एक उदाहरण है। तो कृपया शब्दार्थ के बारे में चिंता न करें।

जवाबों:


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

31
क्या INSERT स्टेटमेंट के ON DUPLICATE कुंजी क्लॉज के साथ यह ठीक से काम करेगा? यही है, अगर मैं दूसरी पंक्ति के उपयोगकर्ता / ईमेल / पते के मूल्यों के साथ विवादित एक पंक्ति सम्मिलित करने का प्रयास कर रहा था, तो क्या INSERT इसके बजाय ON DUPLICATE कुंजी खंड द्वारा निर्दिष्ट कार्य करेगा?
क्लिज़िन

6
इस तरह तीन का संयोजन अद्वितीय होगा? या सभी व्यक्तिगत तीन कॉलम अद्वितीय होंगे?
गैरी लिंडहल

95
MySQL कार्यक्षेत्र का उपयोग करने वाले लोगों के लिए: अनुक्रमित टैब पर जाएं और अपने प्रकार के रूप में UNIQUE चुनें। अपने सूचकांक को एक नाम दें और अनुभाग "इंडेक्स कॉलम" के तहत उपयुक्त कॉलम की जाँच करें
पक्मान

10
मेरी तरह, अगर किसी और ने इसे खोज इंजन से पाया ... और क्लिज़िन के सवाल का जवाब देने के लिए कि क्या ON DUPLICATE KEY एक समग्र कुंजी के साथ काम करेगा - यह बिल्कुल इच्छा करेगा, हालांकि इसके लिए सिंटैक्स में कुछ मामूली समायोजन की आवश्यकता होगी। देख stackoverflow.com/questions/9537710/...
जो

2
इसे NULL मान के साथ भी कैसे काम करें। अगर हम NULL मान के साथ दो समान पंक्तियाँ सम्मिलित करते हैं, तो यह काम नहीं कर रहा है ...
Wasim A.

237

मेरे पास एक 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 की कई NULL पंक्तियों को अनुमति देता है।

मैं MySQL 5.1.42 चला रहा हूं, इसलिए शायद ऊपर चर्चा किए गए मुद्दे पर कुछ अपडेट था। सौभाग्य से यह काम करता है और उम्मीद है कि यह इस तरह से रहेगा।


34
मैं इस उत्तर को चिन्हित करना चाहता था क्योंकि यह आपको दिखाता है कि एक अद्वितीय सूचकांक के साथ एक नई तालिका कैसे बनाई जाए, जैसा कि ऊपर jonstjohn का उत्तर आपको बताता है कि किसी मौजूदा तालिका को कैसे अपडेट किया जाए। वे एक ही काम करते हैं, हालांकि सिर्फ इस बात पर निर्भर करता है कि आपका नया टेबल बनाना है या किसी मौजूदा को अपडेट करना है। :)
गज़ब

3
सभी backquotes के साथ क्या है, क्या वे कुछ उद्देश्य पूरा करते हैं?
PUK

8
यह आउटपुट आउट ऑफ एडमिनिस्ट्रेटर (www.adminer.org) है जो इन बैकक्वाट्स को स्वचालित रूप से सम्मिलित करता है, इसलिए कॉलम नामों के रूप में उपयोग किए जाने वाले mysql कीवर्ड को टकराने से कोई समस्या नहीं है।
फ्रोडिक

50

यदि आप पंक्ति में NULL मान रखते हैं, तो बहु स्तंभ अनन्य अनुक्रमणिकाएँ MySQL में काम नहीं करती हैं क्योंकि MySQL NULL को एक अद्वितीय मान के रूप में मानता है और कम से कम वर्तमान में बहु-स्तंभ अनुक्रमणिकाओं में इसके चारों ओर काम करने के लिए कोई तर्क नहीं है। हां व्यवहार पागल है, क्योंकि यह मल्टी-कॉलम इंडेक्स के बहुत सारे वैध अनुप्रयोगों को सीमित करता है, लेकिन यह वही है जो ... अभी तक, यह एक बग है जिसे MySQL पर "ठीक नहीं होगा" के साथ मुहर लगा दिया गया है बग ट्रैक ...


11
स्पष्टीकरण के दो बिंदु: 1) यह व्यवहार पकड़ में नहीं आता है ENGINE BDB, और, 2) यह प्रलेखित व्यवहार है, हालांकि, IMHO, अतिप्रस्तावित दस्तावेज नहीं दिया गया है यह देखते हुए कि यह कितना आश्चर्यजनक / अप्रिय हो सकता है। चर्चा के लिए MySQL बग 25544 बग s.mysql.com/bug.php?id=25544 देखें ।
पायलट pil

2
NULL सिर के लिए धन्यवाद, इस मुद्दे को संबोधित मैं कर रहा था ... मुझे लगता है कि मैं एक हैश चेकसम के साथ जाऊंगा
डैनियल Doezema

7
यह कोई उत्तर नहीं है। यह मूल प्रश्न के लिए एक टिप्पणी होनी चाहिए।
सीमित प्रायश्चित

आधिकारिक डॉक्स कहते हैं: ध्यान दें कि, MySQL 5.1 के रूप में, BDB अब समर्थित नहीं है।
जॉर्ज डी।

2
बहुत अच्छी जानकारी, लेकिन जवाब नहीं। केवल प्रश्न से संबंधित है।
बिलिन्हा

23

क्या आपने यह कोशिश की है?

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

क्या एरिक मेरे लिए काम करता है ने कहा कि ठीक: UNIQUE KEY thekey` ( user, email, address) `। मैं MYSQL संस्करण 5.5.24 का उपयोग कर रहा हूं यदि आप इसका उपयोग कर रहे हैं तो आप इसे PHPMYADMIN में भी सेट कर सकते हैं। मैं पीएमए के 3.5.1 संस्करण का उपयोग कर रहा हूं।
WQC

इसे MySql 5.6 के साथ आज़माया। पहली कोशिश से काम करता है। धन्यवाद एरिक!
लॉरेंस

11

यह mysql वर्जन 5.5.32 के लिए काम करता है

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

1
यह कॉलम नाम पर एकल उद्धरण के बिना काम करने लगता है।
प्रतीक सिंघल

7

MySql 5 या उच्चतर इस तरह का व्यवहार करता है (मैंने अभी परीक्षण किया है):

  • आप अशक्त स्तंभों को शामिल करते हुए अद्वितीय अवरोधों को परिभाषित कर सकते हैं। मान लें कि आप एक अड़चन को परिभाषित करते हैं (A, B) जहां A अशक्त नहीं है, लेकिन B है
  • इस तरह की बाधा का मूल्यांकन करते समय आप (ए, शून्य) जितनी बार चाहें (एक ही मूल्य) कर सकते हैं!
  • आपके पास केवल एक (A, null B) जोड़ी हो सकती है

उदाहरण: PRODUCT_NAME, PRODUCT_VERSION 'ग्लास', अशक्त 'ग्लास', अशक्त 'शराब', 1

अब यदि आप ('वाइन' 1) को फिर से डालने की कोशिश करते हैं तो यह एक बाधा उल्लंघन की सूचना देगा आशा है कि यह मदद करता है


समझाने के लिए धन्यवाद। मेरे पास अद्वितीय (ए, बी, सी) है और मुझे नहीं पता कि इसने एक ही गैर-शून्य विकल्पों के साथ
अशक्तता के

6

आप phpMyAdmin के माध्यम से कई-स्तंभ अनन्य अनुक्रमणिका जोड़ सकते हैं । (मैंने संस्करण 4.0.4 में परीक्षण किया)

अपने लक्ष्य तालिका के लिए संरचना पृष्ठ पर नेविगेट करें । स्तंभों में से एक में एक अद्वितीय सूचकांक जोड़ें। आपके द्वारा जोड़े गए अनन्य अनुक्रमणिका को देखने के लिए संरचना पृष्ठ के निचले भाग पर अनुक्रमणिका सूची का विस्तार करें । संपादन आइकन पर क्लिक करें, और निम्नलिखित संवाद में आप उस अद्वितीय सूचकांक में अतिरिक्त कॉलम जोड़ सकते हैं।


3

मैं इसे इस तरह से करता हूं:

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

एक अद्वितीय के लिए मेरा सम्मेलन index_nameहै TableName_Column1_Column2_Column3_uindex


2

अद्वितीय सूचकांक जोड़ने के लिए निम्नलिखित आवश्यक हैं:

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`);

1

अगर आप भविष्य में डुप्लिकेट से बचना चाहते हैं। एक अन्य कॉलम बनाएं id2।

UPDATE tablename SET id2 = id;

अब दो कॉलमों पर अद्वितीय जोड़ें:

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

1

यदि आप 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)
);

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 ने अपने नाम से अद्वितीय सूचकांक दिया। मुझे लगता है कि आप तालिका के लिए विकल्पों में सूचकांक का नाम बदल सकते हैं, अगर इसे बदलने की आवश्यकता है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.