2013-04-08 6 views
13
CREATE TABLE foo (
    dt  AS DATE NOT NULL, 
    type AS TEXT NOT NULL, 
    CONSTRAINT unique_dt_type UNIQUE(dt,type) -- check constraint(?) 
) 

जब सही सिंटैक्स जब केवल एक निश्चित शर्त मौजूद एक अद्वितीय बाधा पैदा करने के लिए के बारे में सोच की कोशिश कर रहा एक मस्तिष्क व्यर्थ हो रही है।एसक्यूएल: अद्वितीय बाधा जब स्तंभ एक निश्चित मूल्य

को देखते हुए, type मूल्यों A-F हो सकता है, वहाँ केवल तारीख प्रति एक A हो सकता है, लेकिन वहाँ कई B-F हो सकता है। अच्छी तालिका का उदाहरण:

2010-01-02 | 'A' -- only one 
2010-01-02 | 'B' -- can have multiple 
2010-01-02 | 'B' 
2010-01-02 | 'B' 
2010-01-02 | 'C' -- can have multiple 
2013-01-02 | 'A' -- only one 
2010-01-02 | 'B' -- can have multiple 
2010-01-02 | 'B' 
2013-01-02 | 'F' -- can have multiple 
2013-01-02 | 'F' 

चेक/अद्वितीय वाक्यविन्यास पढ़ने का प्रयास किया लेकिन कोई उदाहरण नहीं थे। CHECK नज़दीक आया लेकिन केवल इसे एक सीमा तक सीमित कर दिया गया था और UNIQUE परिदृश्य के संयोजन के साथ प्रयोग नहीं किया गया था। खोज करने की भी कोशिश की, लेकिन मेरे खोज कौशल या तो बराबर नहीं हैं, या कोई समान प्रश्न नहीं हैं।

+0

आप एक ट्रिगर का उपयोग यह करने के easely सकते हैं! – Houari

+0

@ हुरी: यह वादा करता है, क्या आपके पास एक त्वरित उदाहरण है? जब मैंने 'एसक्यूएल सशर्त अनूठी' की खोज की, तो मुझे कुछ नतीजे मिले, लेकिन कोई सफलता नहीं मिली (वे दिनांकित थे) – vol7ron

+1

मुझे यहां दिए गए प्रश्न में समाधान मिला होगा: http://stackoverflow.com/q/987099/183181, अगर सूचकांक निर्माण – vol7ron

उत्तर

17

PostgreSQL अपनी "आंशिक अनुक्रमणिका" सुविधा के माध्यम से आपकी आवश्यकताओं को संबोधित कर सकता है। प्रैक्टिस में यह इंडेक्स स्टेटमेंट बनाने के लिए एक क्लॉज जोड़कर पूरा किया जाता है।

नमूना:

CREATE INDEX my_partial_ix ON my_sample_table (my_sample_field) 
WHERE NOT (my_sample_field = 'duplicates ok'); 

यहाँ एक नज़र डालें: http://www.postgresql.org/docs/current/interactive/indexes-partial.html

अनुभाग Example 11-3. Setting up a Partial Unique Index पर विशेष ध्यान दें। यह एक उदाहरण देता है जो आपके निर्दिष्ट उद्देश्य से अच्छी तरह से लाइन करता है।

1

एक ट्रिगर का उपयोग करना:

CREATE OR REPLACE FUNCTION "CheckConstraint"() 
    RETURNS trigger AS 
$BODY$declare 
already_exists boolean; 
begin 

if new.foo_type='A' then 
select count(*) >0 from foo where foo_type='A' and dt=new.dt INTO already_exists; 
if already_exists then 
raise exception 'date % already have an A', new.dt; 
end if; 
end if; 

return new; 
end;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
+2

वे बहुत जटिल। यह आंशिक सूचकांक का पैमाने और उपयोग नहीं करेगा, यह बहुत तेज़ और अधिक मजबूत है। –

+0

प्लस, इंडेक्स स्वचालित रूप से मेल खाने वाले प्रश्नों को गति प्रदान करता है। केवल छोटी कमी: सूचकांक को कुछ डिस्क स्थान की आवश्यकता है। –

संबंधित मुद्दे