আমার একটি পোস্টগ্র্যাস্কেল 8.1 ডাটাবেস রয়েছে। এক টেবিলে তিনটি কলাম আছেন: first_name, last_name, display_name।
এটা ডিফল্ট মান সেট করা সম্ভব display_nameহতে first_name + " " + last_name?
আমার একটি পোস্টগ্র্যাস্কেল 8.1 ডাটাবেস রয়েছে। এক টেবিলে তিনটি কলাম আছেন: first_name, last_name, display_name।
এটা ডিফল্ট মান সেট করা সম্ভব display_nameহতে first_name + " " + last_name?
উত্তর:
একটি ট্রিগার ব্যবহার করুন।
এখানে কয়েকটি কোড আপনি বেস হিসাবে ব্যবহার করতে পারেন। আপনার যদি আপডেট আপডেটগুলি পরিচালনা করতে হয় তবে কেবলমাত্র একটি ছোট পরিবর্তন প্রয়োজন।
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...পাশাপাশি আপডেট করা পরিচালনা করবে না ?
আপনার আসলে মূল্য সঞ্চয় করার দরকার নেই ; আপনি এমন একটি ফাংশন তৈরি করতে পারেন যা উত্পন্ন কলামের মতোই উল্লেখ করা যেতে পারে। একটি সতর্কতা হ'ল রেফারেন্সগুলি সর্বদা সারণী বা ওরফে নামের সাথে যোগ্য হতে হবে।
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। :-) আমাদের টেবিলে থাকা নামগুলির মতো কলামগুলি ছিল যা ট্রিগারগুলি দ্বারা রক্ষণাবেক্ষণ করে এবং খুব ব্যথা ছাড়াই এই পদ্ধতির দিকে চলে যায়, তবে আমাদের কাঠামোটিতে সর্বদা একটি উলাম ব্যবহার করা হয় এবং সর্বদা রেফারেন্সের যোগ্যতা অর্জন করে, সুতরাং সেই অংশটি সহজ ছিল। আপনার যদি এমন কোড থাকে যা কোয়ালিফাইং কলাম রেফারেন্সগুলির সাথে সামঞ্জস্যপূর্ণ নয় তবে আমি দেখতে পাচ্ছি যেখানে এই সমস্ত ক্ষেত্রে সন্ধান করার জন্য এটি কোনও ব্যথা হতে পারে।