يعد تحديث البيانات الموجودة شرطًا أساسيًا لتطبيق الويب. إذا قمت بذلك بكفاءة ، اجعل حياتك أسهل. تقدم PostgreSQL ، وهي قاعدة بيانات علائقية قوية وميزة ، حلاً قويًا وأنيقًا لإدارة هذه التحديثات: INSERT ON CONFLICT UPDATE
. من المفيد الجمع بين الإدراج والتحديث إلى Upert واستخدام نفس المنطق لكلتا العمليتين. في هذا المنشور سوف تتعلم كيفية الاستخدام INSERT ON CONFLICT UPDATE
في Postgren لتحسين البيانات بفعالية مع أمثلة عملية. لنبدأ!
جدول المحتويات #
بعد مرور بعد الإدراج على الصراع -update -syntax #
ال INSERT ON CONFLICT
يوفر البند في PostgreSQL طريقة فعالة لتنفيذ عملية Upert. على عكس التقليدية INSERT
البيانات المقترنة UPDATE
البيانات التي تتطلب استفسارات منفصلة ، INSERT ON CONFLICT
يجمع بين كلا الإجراءين في واحد. بناء الجملة كما يلي:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...), (value3, value4, ...), ...
ON CONFLICT (unique_constraint) DO UPDATE
SET column1 = excluded.column1, column2 = excluded.column2, …
RETURNING columns/*
دعونا نقسم هذا الأمر العظيم:
-
INSERT INTO table_name (column1, column2, ...)
: يشير هذا إلى الجدول الهدف والأعمدة التي تم إدراجها أو تحديثها. تأكد من أن أسماء الأعمدة الخاصة بك بالضبط! -
VALUES (value1, value2, ...), (value3, value4, ...), ...
: هذه هي القيم التي تريد إدراجها. يمكنك تقديم عدة قيم للتحسين المتزامن لعدة أسطر. -
ON CONFLICT (unique_constraint)
: هذا هو جوهر عملية Upert. وهي تشير إلى التقييد الواضح (عادةً ما يكون مفتاحًا أساسيًا أو فهرسًا واضحًا) ، والذي يحدد ما إذا كان ينبغي إجراء الاستخدام أو التحديث. يعد التقييد الواضح أمرًا ضروريًا لتحديد ما إذا كان هناك بالفعل رقم. -
SET column1 = excluded.column1, column2 = excluded.column2, ...
: إذا تم تحديد الصراع (خط ذو تقييد واضح) ، يشير هذا القسم إلى تحديث الأعمدة وقيمه الجديدة. الكلمة الرئيسيةexcluded
يشير إلى القيم التي كانت أصلا المقدمة فيVALUES
بند. هذا يساعد على تحديث الخط الموجود بكفاءة دون قسائم فرعية معقدة. -
RETURNING
: يعود البند من التعليمات أو التحديث. قيم جميع الأعمدة بعد الإدراج أو التحديث. يمكنك اختيار بعض الأعمدة أو كل شيء مع واحد*
.
يمكنك إدراج وإدراج المزيد حول الاستخدام وجزء الصراع في الوثائق الرسمية. يمكنك أيضًا القراءة حول برنامج Postgres Node.js إذا كنت ترغب في إنشاء تطبيق Node.js بسيط يتفاعل مع Postgren. يمكنك أيضًا القراءة بعد إدخال عدة خطوط لمعرفة المزيد حول التقنيات التي يمكن من خلالها استخدام عدة خطوط بكفاءة مع نفس المثال المستخدم أدناه.
إذا كان تطبيقك يحتوي على بيانات أيضًا ، فيجب تحديث البيانات أيضًا. لذلك ، يصبح الجمع بين المهمتين أكثر قابلية للإدارة حيث يصبح التناقص مفيدًا. بالإضافة إلى INSERT ON CONFICT UPDATE
في الإصدار الأحدث من Postgrees ، وهو من 15 عامًا ، يتوفر أيضًا بيان دمج.
مثال UPSER مع عروض الأسعار جدول #
دعونا نوضح INSERT ON CONFLICT UPDATE
مع مثال عملي مع أ quotes
طاولة. يخزن هذا الجدول اقتباسات مع مؤلفيك ولديه الهيكل التالي:
CREATE TABLE quote (
id SERIAL PRIMARY KEY,
quote character varying(255) NOT NULL UNIQUE,
author character varying(255) NOT NULL,
created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
);
الآن دعنا ننشئ استعلامًا يدرج 17 اقتباسًا في هذا الجدول عبر البرمجة من أجل العمل مع البيانات الأولى:
INSERT INTO quote (quote, author) VALUES
('There are only two kinds of languages: the ones people complain about and the ones nobody uses.', 'Bjarne Stroustrup'),
('Any fool can write code that a computer can understand. Good programmers write code that humans can understand.', 'Martin Fowler'),
('First, solve the problem. Then, write the code.', 'John Johnson'),
('Java is to JavaScript what car is to Carpet.', 'Chris Heilmann'),
('Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.', 'John Woods'),
('I''m not a great programmer; I''m just a good programmer with great habits.', 'Kent Beck'),
('Truth can only be found in one place: the code.', 'Robert C. Martin'),
('If you have to spend effort looking at a fragment of code and figuring out what it''s doing, then you should extract it into a function and name the function after the "what".', 'Martin Fowler'),
('The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.', 'Donald Knuth'),
('SQL, Lisp, and Haskell are the only programming languages that I’ve seen where one spends more time thinking than typing.', 'Philip Greenspun'),
('Deleted code is debugged code.', 'Jeff Sickel'),
('There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.', 'C.A.R. Hoare'),
('Simplicity is prerequisite for reliability.', 'Edsger W. Dijkstra'),
('There are only two hard things in Computer Science: cache invalidation and naming things.', 'Phil Karlton'),
('Measuring programming progress by lines of code is like measuring aircraft building progress by weight.', 'Bill Gates'),
('Controlling complexity is the essence of computer programming.', 'Brian Kernighan'),
('The only way to learn a new programming language is by writing programs in it.', 'Dennis Ritchie');
في القسم التالي ، سترى بعض الأمثلة على زيادة سطر واحد ثم عدة خطوط في ما سبق quote
طاولة.
تصفح سطر واحد في جدول الاقتباس #
دعنا نتخيل سيناريو يمكن فيه تحرير عرض أسعار باستخدام نموذج ، وهناك شكل آخر لإدراج عروض أسعار جديدة. يمكن لهذين النموذجين استخدام اثنين من الاستعلامات المختلفة ، أدخل واحد واستخدام تحديث. ومع ذلك ، سيكون من الأسهل بكثير وأكثر راحة إذا كان كلا التطبيقين سيستخدمون استعلام SQL واحد مع UPST. يمكن الحصول على هذا الاستعلام في الدراسات العليا عن طريق الوصول إلى الاستفسارات INSERT ON CONFLICT UPDATE
أما أن نرى أدناه:
INSERT INTO quote (id, quote, author) VALUES
(3, 'First, solve the problem. Then, write the code1.', 'John Johnson1')
ON CONFLICT (id) DO UPDATE
SET quote = excluded.quote, author = excluded.author, updated_at = DEFAULT
RETURNING *;
يحاول هذا الاستعلام تحسين عرض أسعار واحد. إذا كان المعرف الواضح للاقتباس (المفتاح الرئيسي) موجود بالفعل ، كلاهما ، كلاهما quote
و author
يتم تحديث الأعمدة لتعكس القيمة الجديدة. الأصل created_at
يتم الحفاظ على الطابع الزمني و updated_at
سيحصل على آخر وقت محدث مع ذلك DEFAULT
الكلمة الرئيسية التي تتوافق مع الطابع الزمني الحالي. القيم المذكورة أعلاه لا معنى لها ، لكنها تستخدم لإظهار أنه يتم تحديث الخطوط. إذا قمت بتحديد المعرف باسم null
يتم إدخاله لأنه لا يتعارض مع معرف موجود.
يحسن عدة خطوط في جدول عروض الأسعار #
قوة INSERT ON CONFLICT UPDATE
حقا إذا كان عليك التعامل مع عدة خطوط. دعنا نفترض ، على سبيل المثال ، أن لديك ملف CSV مع قائمة بالاقتباسات ومؤلفيك التي تريد استيرادها إلى quotes
طاولة. يمكنك استخدام استعلام واحد لإدراج جميع الاقتباسات للتأكد من تحديث العروض الحالية بكفاءة. هذا يدل على انخفاض كبير في التكاليف العامة مقارنة بتنفيذ العديد من الأشخاص INSERT
و UPDATE
العمليات.
فيما يلي عينة استعلام يوضح هذا المفهوم بافتراض أن CSV لديها اقتباسين فقط:
INSERT INTO quote (id, quote, author) VALUES
(4, 'Java is to JavaScript what car is to Carpet.2', 'Chris Heilmann2'),
(11, 'Deleted code is debugged code.3', 'Jeff Sickel3')
ON CONFLICT (id) DO UPDATE
SET quote = excluded.quote, author = excluded.author, updated_at = DEFAULT
RETURNING *;
إذا كان تطبيقًا فعليًا VALUES
كان قد تم بناء الجزء بناءً على البيانات المقدمة في CSV. كان من الممكن تنفيذ هذا باستخدام استعلام معلمة أو مكتبة ORT (كائن -ارتباطًا علليًا). على النحو الوارد أعلاه عند تعيينه id
مثل null
تم إدخال هذه السلسلة. في الحالة quote
جدول ذلك quote
العمود واضح أيضا. إذا كان الاقتباس المحدد يطابق عرضًا موجودًا ، فقد تتلقى خطأ. استخدم quote
عمود من هذا القبيل conflict target
يمكن أن يكون الصراع وسيلة أخرى للتعامل مع هذا الموضوع.
في هذا المثال ، استخدم المعرف ، ولكن لتطبيقك ، يمكنك استخدام أي عمود واضح أو تقييد واضح مع مجموعة من أكثر من عمود واحد. إذا تم نقل الأعمدة بشكل صحيح إليها conflict target
ال ON CONFLICT(...)
سيعمل الجزء كما هو متوقع.
يمكنك العثور على كلا المثالين مثل DB Geige يمكنك القيام بما ينظر إليه عند تشغيله:
يمكنك اللعب مع هذا الكمان DB ، وأعطتهم واستخدامها لتجاربهم كما تريد.
دبلوم #
postgresql's INSERT ON CONFLICT UPDATE
توفر الوظيفة طريقة قوية وفعالة لإدارة تحديثات البيانات. يمكن أن يؤدي فهم بناء الجملة والاعتبارات الأخرى إلى تحسين عمليات قاعدة البيانات الخاصة بك بشكل كبير ، خاصة إذا كانت هناك تحديثات جماعية ، لتحسين أداء تطبيقاتك.
لقد تعلمت في الدراسات العليا حول Upert INSERT ON CONFLICT UPDATE
شرط المستخدم في جدول عروض الأسعار لتحسين الأسطر الفردية والعديد من الخطوط. إعطاء الأولوية للـ SQL فعالة دائمًا ، SQL بشكل جيد منظمة وتقنيات لتحسين رمز التطبيق الخاص بك ، على سبيل المثال