إدراج...عودة..يأتي فارغًا عندما يقوم المشغل بإلغاء العبارة

StackOverflow https://stackoverflow.com//questions/24046173

سؤال

لدي 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 البيانات إلى الجداول المستهدفة الفعلية ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top