प्राथमिक कुंजी के रूप में
ऐसा करें यदि वह अद्वितीय प्राथमिक कुंजी है:
create table tbl(
a_id int not null,
b_id int not null,
constraint tbl_pkey primary key(a_id,b_id)
);
प्राथमिक कुंजी नहीं
ऐसा करें यदि वह अद्वितीय गैर-प्राथमिक कुंजी है:
create table tbl(
-- other primary key here, e.g.:
-- id serial primary key,
a_id int not null,
b_id int not null,
constraint tbl_unique unique(a_id,b_id)
);
मौजूदा तालिका
यदि आपके पास मौजूदा तालिका है, तो इसके बजाय ऐसा करें:
alter table tbl
add constraint tbl_unique unique(a_id, b_id)
वह परिवर्तन तालिका इस संदेश को प्रदर्शित करती है:
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"
Query returned successfully with no result in 22 ms.
छोड़ें
यदि आप उस बाधा को छोड़ना चाहते हैं (आप 3 क्षेत्रों का संयोजन अद्वितीय बनाना चाहते हैं):
ALTER TABLE tbl DROP CONSTRAINT tbl_unique;
सूचकांक और बाधा और शून्य
अनुक्रमणिका के संबंध में, Postgres doc से:
स्रोत:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html
यदि विशिष्टता कुछ नियमों पर निर्भर करती है, तो आप CREATE UNIQUE INDEX
का उपयोग करेंगे , उदाहरण के लिए:
इसे देखते हुए:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
वह अद्वितीय इन डुप्लिकेट को पकड़ सकता है, इसे डेटाबेस द्वारा अस्वीकार कर दिया जाएगा:
insert into tbl values
(1,1),
(1,1);
फिर भी वह UNIQUE CONSTRAINT डुप्लिकेट नल को नहीं पकड़ सकता है। नल अज्ञात के रूप में कार्य करता है, वे वाइल्डकार्ड के रूप में कार्य करते हैं, यही कारण है कि अद्वितीय बाधाओं में एकाधिक नल रखने की अनुमति है। इसे डेटाबेस द्वारा स्वीकार किया जाएगा:
insert into tbl values
(1,1),
(1,null), -- think of this null as wildcard, some real value can be assigned later.
(1,null); -- and so is this. that's why both of these nulls are allowed
UNIQUE CONSTRAINT
के बारे में सोचें कि यह आस्थगित विशिष्टता की अनुमति देता है, इसलिए उपरोक्त शून्य मानों की स्वीकृति।
यदि आप अद्वितीय बाधा के अलावा, प्रति a_id केवल एक वाइल्डकार्ड(null b_id) चाहते हैं, तो आपको एक UNIQUE INDEX
जोड़ना होगा . UNIQUE CONSTRAINT की उन पर कोई अभिव्यक्ति नहीं हो सकती है। INDEX
और UNIQUE INDEX
कर सकते हैं। एकाधिक नल को अस्वीकार करने के लिए यह आपका पूरा डीडीएल होगा;
यह आपका पूरा DDL होगा:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
create unique index tbl_unique_a_id on tbl(a_id) where b_id is null;
इसे अब आपके डेटाबेस द्वारा अस्वीकार कर दिया जाएगा:
insert into tbl values
(1,1),
(1,null),
(1,null);
इसकी अनुमति होगी:
insert into tbl values
(1,1),
(1,null);
http://www.ienablemuch से संबंधित .com/2010/12/postgresql-said-sql-server2008-said-non.html