खोज…
परिचय
MERGE (जिसे अक्सर "अपडेट या इंसर्ट" के लिए UPSERT भी कहा जाता है) नई पंक्तियों को सम्मिलित करने की अनुमति देता है या, यदि कोई पंक्ति पहले से मौजूद है, तो मौजूदा पंक्ति को अद्यतन करने के लिए। बिंदु ऑपरेशन के पूरे सेट को परमाणु रूप से निष्पादित करने के लिए है (यह सुनिश्चित करने के लिए कि डेटा लगातार बना रहता है), और क्लाइंट / सर्वर सिस्टम में कई SQL स्टेटमेंट के लिए संचार ओवरहेड को रोकने के लिए।
लक्ष्य मैच स्रोत बनाने के लिए
MERGE INTO targetTable t
USING sourceTable s
ON t.PKID = s.PKID
WHEN MATCHED AND NOT EXISTS (
SELECT s.ColumnA, s.ColumnB, s.ColumnC
INTERSECT
SELECT t.ColumnA, t.ColumnB, s.ColumnC
)
THEN UPDATE SET
t.ColumnA = s.ColumnA
,t.ColumnB = s.ColumnB
,t.ColumnC = s.ColumnC
WHEN NOT MATCHED BY TARGET
THEN INSERT (PKID, ColumnA, ColumnB, ColumnC)
VALUES (s.PKID, s.ColumnA, s.ColumnB, s.ColumnC)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
;
ध्यान दें: AND NOT EXISTS
अंश भाग रिकॉर्ड्स को बदलने से रोकता है जो परिवर्तित नहीं हुए हैं। INTERSECT
कंस्ट्रक्शन का उपयोग करने से विशेष हैंडलिंग के बिना अशक्त स्तंभों की तुलना की जा सकती है।
MySQL: नाम से उपयोगकर्ताओं की गिनती
मान लीजिए हम जानना चाहते हैं कि एक ही नाम के कितने उपयोगकर्ता हैं। आइए हम तालिका users
को निम्नानुसार बनाते हैं:
create table users(
id int primary key auto_increment,
name varchar(8),
count int,
unique key name(name)
);
अब, हमने सिर्फ जो नाम के एक नए उपयोगकर्ता की खोज की है और उसे ध्यान में रखना चाहते हैं। इसे प्राप्त करने के लिए, हमें यह निर्धारित करने की आवश्यकता है कि क्या उसके नाम के साथ एक मौजूदा पंक्ति है, और यदि ऐसा है, तो इसे वेतन वृद्धि के लिए अपडेट करें; दूसरी ओर, यदि कोई मौजूदा पंक्ति नहीं है, तो हमें इसे बनाना चाहिए।
MySQL निम्न सिंटैक्स का उपयोग करता है: डुप्लिकेट कुंजी अद्यतन पर सम्मिलित करें… । इस मामले में:
insert into users(name, count)
values ('Joe', 1)
on duplicate key update count=count+1;
PostgreSQL: नाम से उपयोगकर्ताओं की गिनती
मान लीजिए हम जानना चाहते हैं कि एक ही नाम के कितने उपयोगकर्ता हैं। आइए हम तालिका users
को निम्नानुसार बनाते हैं:
create table users(
id serial,
name varchar(8) unique,
count int
);
अब, हमने सिर्फ जो नाम के एक नए उपयोगकर्ता की खोज की है और उसे ध्यान में रखना चाहते हैं। इसे प्राप्त करने के लिए, हमें यह निर्धारित करने की आवश्यकता है कि क्या उसके नाम के साथ एक मौजूदा पंक्ति है, और यदि ऐसा है, तो इसे वेतन वृद्धि के लिए अपडेट करें; दूसरी ओर, यदि कोई मौजूदा पंक्ति नहीं है, तो हमें इसे बनाना चाहिए।
PostgreSQL निम्नलिखित सिंटैक्स का उपयोग करता है: सम्मिलित करें ... संघर्ष पर ... अपडेट करें ...। इस मामले में:
insert into users(name, count)
values('Joe', 1)
on conflict (name) do update set count = users.count + 1;