स्तंभ के डिफ़ॉल्ट मान को दो अन्य स्तंभों के मानों के संयोजन के लिए सेट करें?


13

मेरे पास Postgresql 8.1 डेटाबेस है। एक तालिका में, वहाँ तीन स्तंभ हैं: first_name, last_name, display_name

क्या होने का डिफ़ॉल्ट मान सेट करना संभव display_nameहै first_name + " " + last_name?


मुझे पता है कि यह 7 साल से अधिक पुरानी पोस्ट है। लेकिन, बस उत्सुक होने के लिए, क्या आपको इस मामले के लिए दृश्य का उपयोग नहीं करना चाहिए? किसी अपडेट की जरूरत नहीं होगी, कोई स्टोर ओवरहेड नहीं होगा, ट्रिगर की जरूरत नहीं होगी आदि?
हर्ष

जवाबों:


15

एक ट्रिगर का उपयोग करें।

यहां कुछ कोड दिए गए हैं जिन्हें आप आधार के रूप में उपयोग कर सकते हैं। यदि आपको UPDATEs को संभालने की आवश्यकता है, तो केवल एक छोटे से परिवर्तन की आवश्यकता है।

 create table people
 (
   first_name varchar(20),
   last_name varchar(20),
   display_name varchar(40)
 );
CREATE TABLE
 CREATE OR REPLACE FUNCTION people_insert() RETURNS trigger AS '
     BEGIN
         NEW.display_name := NEW.first_name||'' ''||NEW.last_name;
         RETURN NEW;
     END;
 ' LANGUAGE plpgsql;

 postgres=# CREATE FUNCTION


 CREATE TRIGGER people_insert BEFORE INSERT OR UPDATE ON people FOR 
 EACH ROW EXECUTE PROCEDURE people_insert();

postgres=# CREATE TRIGGER
 insert into people values ('Larry','Ellison');

postgres=# INSERT 0 1

 postgres=# select * from people;
 first_name | last_name | display_name
------------+-----------+---------------
 Larry      | Ellison   | Larry Ellison
(1 row)

postgres=#

धन्यवाद! क्या लाइन CREATE TRIGGER people_insert BEFORE INSERT OR UPDATE...अपडेट करने से भी नहीं निपटेगा?
मैटसियर

अरे हां। आधा सो गया होगा :)
फिलो

यदि आप ध्यान दें तो display_name शायद 41 साल का होना चाहिए। चूंकि आप दो 20 चार कॉलमों के बीच एक स्थान जोड़ते हैं।
isaaclw

मैं देखता हूं कि यह समाधान डालने के ऑपरेशन के लिए लगभग 15% ओवरहेड जोड़ता है :-(
अकवेल

17

आपको वास्तव में मूल्य संग्रहीत करने की आवश्यकता नहीं है ; आप एक ऐसा फ़ंक्शन बना सकते हैं जिसे एक उत्पन्न कॉलम की तरह संदर्भित किया जा सकता है। एक चेतावनी यह है कि संदर्भ हमेशा तालिका या अन्य नाम के साथ योग्य होना चाहिए।

CREATE TABLE person
  (
    id int PRIMARY KEY,
    first_name text,
    last_name text NOT NULL
  );

INSERT INTO person
  VALUES
    (1, 'John', 'Smith'),
    (2, 'Jane', 'Doe'),
    (3, NULL, 'Prince');

CREATE FUNCTION display_name(rec person)
  RETURNS text
  STABLE
  LANGUAGE SQL
  COST 5
AS $$
  SELECT
    CASE
      WHEN $1.first_name IS NULL THEN ''
      ELSE $1.first_name || ' '
    END || $1.last_name;
$$;

SELECT p.id, p.display_name FROM person p;

परिणाम:

आईडी | प्रदर्शित होने वाला नाम
---- + --------------
  1 | जॉन स्मिथ
  2 | जेन डोए
  3 | राजकुमार
(3 पंक्तियाँ)

तुम भी उत्पन्न मूल्य पर अनुक्रमणिका समानता के आधार पर KNN खोजों का उपयोग करने सहित सूचकांक कर सकते हैं। उदाहरण के लिए:

CREATE EXTENSION pg_trgm;

CREATE INDEX person_trgm_name
  ON person
  USING gist
  (display_name(person) gist_trgm_ops);

SELECT
    p.id,
    p.display_name,
    similarity(p.display_name, 'Jane')
  FROM person p
  ORDER BY p.display_name <-> 'Jane'
  LIMIT 2;

खोज स्ट्रिंग से "दूरी" के क्रम में सूचकांक स्कैन से इस प्रकार की खोज रिटर्न पंक्तियाँ होती हैं। यदि आप यह देखना चाहते हैं कि वे कितने "करीब" थे, तो आप या तो दूरी ऑपरेटर ( <->) या similarity()फ़ंक्शन (जो 1 - दूरी) का उपयोग कर सकते हैं। एक KNN खोज K "निकटतम पड़ोसियों" को बहुत जल्दी, यहां तक ​​कि बहुत बड़े डेटा सेट के साथ वापस कर सकती है।


मुझे वास्तव में बैकवर्ड संगतता के लिए मूल्य को स्टोर करने की आवश्यकता है, लेकिन यह एक बहुत अच्छा दृष्टिकोण है! मेरा OCD हिस्सा भी चाहता है कि NULL अंतिम नामों के लिए एक चेक हो, लेकिन इसका मतलब होगा कि आपके पास उस बिंदु पर चिंता करने के लिए बड़ी डेटा अखंडता मुद्दे होंगे
मैटासियर

खैर, मैंने अपने उदाहरण में घोषित last_nameकिया NOT NULL। :-) हमारे पास ऐसे स्तंभ थे जिनका नाम तालिका में था और ट्रिगर्स द्वारा बनाए रखा गया था और बहुत दर्द के बिना इस दृष्टिकोण पर स्विच किया गया था, लेकिन हमारी रूपरेखा हमेशा एक उपनाम का उपयोग करती है और हमेशा संदर्भों को योग्य बनाती है, ताकि यह हिस्सा आसान हो। यदि आपके पास ऐसा कोड है जो योग्य स्तंभ संदर्भों के अनुरूप नहीं है, तो मैं देख सकता हूं कि उन सभी मामलों को ट्रैक करने के लिए दर्द कहां हो सकता है।
19

2

स्तंभ तालिका पर DEFAULT सेटिंग के साथ, nope।

यहां आपका सबसे अच्छा शर्त है कि आप जिस कॉलम की गणना करना चाहते हैं उसके लिए नए मूल्य के साथ एक ट्राइगर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.