অন্য দুটি কলামের মানগুলির সংমিশ্রণে একটি কলামের ডিফল্ট মান সেট করবেন?


13

আমার একটি পোস্টগ্র্যাস্কেল 8.1 ডাটাবেস রয়েছে। এক টেবিলে তিনটি কলাম আছেন: first_name, last_name, display_name

এটা ডিফল্ট মান সেট করা সম্ভব display_nameহতে first_name + " " + last_name?


আমি জানি এটি একটি 7 বছরেরও বেশি পুরানো পোস্ট। তবে, কেবল কৌতূহলী হওয়ার জন্য, আপনার কি এই ক্ষেত্রে দৃষ্টিভঙ্গি ব্যবহার করা উচিত নয়? কোনও আপডেটের প্রয়োজন হবে না, কোনও স্টোর ওভারহেড হবে না, কোনও ট্রিগারের প্রয়োজন নেই ইত্যাদি?
হর্ষ

উত্তর:


15

একটি ট্রিগার ব্যবহার করুন।

এখানে কয়েকটি কোড আপনি বেস হিসাবে ব্যবহার করতে পারেন। আপনার যদি আপডেট আপডেটগুলি পরিচালনা করতে হয় তবে কেবলমাত্র একটি ছোট পরিবর্তন প্রয়োজন।

 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...পাশাপাশি আপডেট করা পরিচালনা করবে না ?
ম্যাটসায়ার

ও আচ্ছা. অর্ধেক ঘুমিয়ে পড়ে থাকতে হবে :)
ফিলি

যদি আপনি যত্ন নেন তবে প্রদর্শন নামটি সম্ভবত 41 টি হওয়া উচিত। যেহেতু আপনি দুটি 20 চর কলামের মধ্যে একটি স্থান যুক্ত করেছেন।
isaaclw

আমি দেখতে পাচ্ছি যে এই সমাধানটি
sertোকানো

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;

ফলাফলগুলো:

আইডি | DISPLAY_NAME
---- + + --------------
  1 | জন স্মিথ
  2 | জেন ডো
  3 | রাজপুত্র
(3 সারি)

এমনকি জেনারেটড ভ্যালুতেও ত্রিগ্রামের মিলের ভিত্তিতে কেএনএন অনুসন্ধানগুলি ব্যবহার করে সূচক করতে পারেন। উদাহরণ স্বরূপ:

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 - দূরত্ব) ব্যবহার করতে পারেন। একটি কেএনএন অনুসন্ধান খুব বড় ডেটা সেট করেও কে "নিকটতম প্রতিবেশী" খুব দ্রুত ফিরিয়ে দিতে পারে।


পিছনে সামঞ্জস্যের জন্য আমার আসলে মূল্য সঞ্চয় করতে হবে না, তবে এটি একটি দুর্দান্ত শীতল পদ্ধতির! আমার ওসিডি
অংশটিও চাইছে নূন্যতম পদগুলির

ঠিক আছে, আমি আমার উদাহরণ last_nameহতে হবে ঘোষণা NOT NULL। :-) আমাদের টেবিলে থাকা নামগুলির মতো কলামগুলি ছিল যা ট্রিগারগুলি দ্বারা রক্ষণাবেক্ষণ করে এবং খুব ব্যথা ছাড়াই এই পদ্ধতির দিকে চলে যায়, তবে আমাদের কাঠামোটিতে সর্বদা একটি উলাম ব্যবহার করা হয় এবং সর্বদা রেফারেন্সের যোগ্যতা অর্জন করে, সুতরাং সেই অংশটি সহজ ছিল। আপনার যদি এমন কোড থাকে যা কোয়ালিফাইং কলাম রেফারেন্সগুলির সাথে সামঞ্জস্যপূর্ণ নয় তবে আমি দেখতে পাচ্ছি যেখানে এই সমস্ত ক্ষেত্রে সন্ধান করার জন্য এটি কোনও ব্যথা হতে পারে।
কেজিগ্রিট্টন

2

কলামের টেবিলে ডিফল্ট সেটিং সহ, না।

এখানে আপনার সেরা বেটটি হ'ল প্রতিটি গুণমানের জন্য নতুন মান সহ একটি ট্রিগার comp

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.