2012-03-04 13 views
8

मैं पोस्टग्रेएसक्यूएल का उपयोग कर रहा हूं और खाली स्ट्रिंग इनपुट की अनुमति देने से कुछ आवश्यक वर्णक VARYING (VARCHAR) फ़ील्ड को रोकना चाहता हूं।वर्णक क्षेत्र में खाली तारों को रोकें

इन क्षेत्रों में अद्वितीय मूल्य भी शामिल होंगे, इसलिए मैं पहले से ही एक अद्वितीय बाधा का उपयोग कर रहा हूं; हालांकि, यह एक मूल (अद्वितीय) खाली मूल्य को रोकता नहीं है।

बुनियादी उदाहरण है, जहां उपयोगकर्ता नाम '... बाधा जांच' अद्वितीय और खाली नहीं

| id | username | password | 
+----+----------+----------+ 
| 1 | User1 | pw1  | #Allowed 
| 2 | User2 | pw1  | #Allowed 
| 3 | User2 | pw2  | #Already prevented by constraint 
| 4 | ''  | pw2  | #Currently allowed, but needs to be prevented 

उत्तर

14

उपयोग एक check constraint:

CREATE TABLE foobar(
    x TEXT NOT NULL UNIQUE, 
    CHECK (x <> '') 
); 

INSERT INTO foobar(x) VALUES(''); 
5

आप मानक SQL का उपयोग कर सकते होने की जरूरत है खंड जब तालिका क्षेत्रों को परिभाषित:

CREATE TABLE test 
(
    nonempty VARCHAR NOT NULL UNIQUE CONSTRAINT non_empty CHECK(length(nonempty)>0) 
) 
2

बाधा एक खास किस्म के रूप में, आप डेटाप्रकार + कंस्ट्रक्शन डाल सकते हैं एक डोमेन में नहीं है:

-- set search_path='tmp'; 

DROP DOMAIN birthdate CASCADE; 
CREATE DOMAIN birthdate AS date DEFAULT NULL 
    CHECK (value >= '1900-01-01' AND value <= now()) 
    ; 

DROP DOMAIN username CASCADE; 
CREATE DOMAIN username AS VARCHAR NOT NULL 
    CHECK (length(value) > 0) 
    ; 

DROP TABLE employee CASCADE; 
CREATE TABLE employee 
    (empno INTEGER NOT NULL PRIMARY KEY 
    , dob birthdate 
    , zname username 
    , UNIQUE (zname) 
    ); 
INSERT INTO employee(empno,dob,zname) 
    VALUES (1,'1980-02-02', 'John Doe'), (2,'1980-02-02', 'Jon Doeh'); 
INSERT INTO employee(empno,dob,zname) 
    VALUES (3,'1980-02-02', ''), (4,'1980-01-01', 'Joan Doh'); 

इस बाधा हर बार नकल के बिना, आप डोमेन फिर से और फिर पुन: उपयोग करने की अनुमति देगा।

+0

https://en.wikipedia.org/wiki/Jeralean_Talley – OdraEncoded

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