PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

तालिका में शामिल होने के लिए अद्वितीय बहु-स्तंभ अनुक्रमणिका पोस्टग्रेज करता है

प्राथमिक कुंजी के रूप में

ऐसा करें यदि वह अद्वितीय प्राथमिक कुंजी है:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक्सेल से पोस्टग्रेएसक्यूएल में डेटा आयात करें

  2. मैं इस असामान्य मिलान मानदंड के साथ एक जुड़ाव कैसे लिखूं?

  3. एक्टो क्वेरी - तिथियां + पोस्टग्रेज अंतराल + क्वेरी इंटरपोलेशन

  4. क्या मैं PostgreSQL में एक बाइटा फ़ील्ड पर एक आकार सीमा (dbase के भीतर) सेट कर सकता हूं?

  5. Nagios का उपयोग करके PostgreSQL की निगरानी कैसे करें