दस्तावेज़ीकरण के अनुसार ,
इसलिए हटाना not null
Status
. से बाधा और (ContactId,PhoneId,Status)
. पर एक अद्वितीय अनुक्रमणिका जोड़ना यदि आप null
का उपयोग करते हैं, तो यह आपकी इच्छानुसार काम करेगा, 0
. के बजाय निष्क्रिय . के लिए रिकॉर्ड।
यदि आप null
. का उपयोग नहीं करना चाहते हैं या नहीं कर सकते हैं आपके Status
. के लिए कॉलम, सुनिश्चित करना चाहते हैं कि दोनों Status=0
और Status=null
समान व्यवहार करें, या उदा। Status=2
. का इलाज करना चाहते हैं सक्रिय . के रूप में (और विशिष्टता को लागू करना) भी, आप एक डमी कॉलम जोड़ सकते हैं जिसकी गणना Status
से की जाएगी ।
यदि आप MySQL 5.7+ का उपयोग कर रहे हैं, तो आप इसे जेनरेट किए गए कॉलम के साथ कर सकते हैं:
CREATE TABLE IF NOT EXISTS `ContactPhone` (
`ContactPhoneId` int(10) unsigned NOT NULL auto_increment primary key,
`ContactId` int(11) NOT NULL,
`PhoneId` smallint(5) unsigned NOT NULL,
`Status` tinyint(1) NOT NULL DEFAULT '1',
`StatusUnq` tinyint(1) as (if(Status <> 0, 1, null)) stored null,
constraint unique (ContactId, PhoneId, StatusUnq)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (1, 1, 1, 1);
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (2, 1, 1, 1);
-- Duplicate key error
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (3, 1, 1, 0);
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (4, 1, 1, 0);
update ContactPhone set Status = 1 where ContactPhoneId = 4;
-- Duplicate key error
अन्यथा, आप एक सामान्य स्तंभ का उपयोग कर सकते हैं और स्तंभ के मान की गणना करने के लिए ट्रिगर का उपयोग कर सकते हैं, उदा.:
create trigger trbi_contactPhoneUnique before insert on ContactPhone
for each row
set new.StatusUnq = if(new.Status <> 0, 1, null);
create trigger trbu_contactPhoneUnique before update on ContactPhone
for each row
set new.StatusUnq = if(new.Status <> 0, 1, null);
आप निश्चित रूप से सूत्र को उदा में बदल सकते हैं। if(new.Status <> 0, new.Status, null);
यदि आप Status
. के विभिन्न मानों को अनुमति देना चाहते हैं बहुत।