إدراج...عودة..يأتي فارغًا عندما يقوم المشغل بإلغاء العبارة
-
21-12-2019 - |
سؤال
لدي PostgreSQL قبل إدراج المشغل عند الإنشاء والذي يعيد توجيه الإدخالات بشكل أساسي إلى الجداول الفرعية.بمجرد إدراج السجل، أريد إلغاء الطلب لتجنب البيانات المكررة (من خلال عدم الإدراج في الجدول الأصلي) لذلك أستخدم الإرجاع NULL في المشغل.المشكلة هي أنني بحاجة إلى إعادة السجل حتى أتمكن من الحصول على المعرف.إذا قمت بإرجاع NULL، سأحصل على NULL.
تمت مناقشة المشكلة أعلاه على الرابط أدناه:مشغل PostgreSQL لا يعيد أي شيء
تقول إحدى الإجابات أن يتم إدراجها في الجدول الأصلي (من خلال عدم إرجاع قيمة فارغة ولكن إرجاع جديد) واستخدام مشغل الإدراج بعد لحذفه من الجدول الأصلي.لكنني أتطلع إلى 1000 عملية كتابة في الثانية وقد تكون هذه مشكلة خطيرة فيما يتعلق بالأداء بسبب عمليات الحذف. هل هناك أي طريقة أخرى للقيام بذلك؟
على وجه الدقة، هل هناك طريقة لإرجاع معرف الصف المدرج دون إدراجه في الجدول الأصلي وحذفه لاحقًا.
المحلول
كتبت الجواب الذي تشير إليه.كما أشرت بالفعل هناك:
يمكنك أيضًا استخدام أ
RULE ... INSTEAD ..
لهذا الغرض.
RULE
قواعد يمكن أن تكون صعبة.أفضل استخدام المشغلات حيثما أمكن ذلك. تأكد من قراءة قليلا, ، قبل تجربة هذا:
CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...) -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...) -- ... you want to insert column defaults
RETURNING tbl2.*
من شأنه أن يعود القيم من tbl2
مع تجنب الصفوف الوهمية. لكن, لكل وثائق على CREATE RULE
:
في قاعدة ل
INSERT
,UPDATE
, ، أوDELETE
في طريقة عرض، يمكنك إضافةRETURNING
العبارة التي تنبعث منها أعمدة العرض.سيتم استخدام هذا البند لحساب المخرجات إذا تم تشغيل القاعدة بواسطةINSERT RETURNING
,UPDATE RETURNING
, ، أوDELETE RETURNING
الأمر على التوالي.عندما يتم تشغيل القاعدة بواسطة أمر بدونRETURNING
, ، القواعدRETURNING
سيتم تجاهل البند. يسمح التنفيذ الحالي فقط غير المشروطINSTEAD
قواعد لاحتواءRETURNING
;
منجم التركيز الجريء.
منذ أن ذكرت sub-tables
, ، أعتبر أنك ستحتاج إلى شروط لتوزيع الإدخالات ...
currval()
/ lastval()
إذا كنت تعمل مع الزناد FOR EACH ROW
يمكنك بسهولة جلب القيم المناسبة من التسلسلات باستخدام currval()
/ lastval()
.الجزء الصعب هو إرجاع تلك القيم من وظيفة المشغل.لا أستطيع إلا أن أفكر في الكتابة إلى جدول مؤقت.يحتاج إلى بعض التفكير متى يتم إنشاء ذلك ومتى يتم إسقاطه ...
ربما سأفعل إعادة التفكير في النهج بأكمله وإعادة توجيه البيانات إلى متعددة INSERT
البيانات إلى الجداول المستهدفة الفعلية ...