الجدول الموروث بعد postgreSQL دائمًا صفه مع القيمة الفارغة

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

  •  23-09-2019
  •  | 
  •  

سؤال

أنا أشير إلى http://www.if-not-true-then-false.com/2009/11/howto-create-postgresql-table-partitioning-part-1/

لإعادة إنتاج المشكلة ، إليك بعض الخطوات البسيطة التي يجب متابعتها:

(1) إنشاء قاعدة بيانات تسمى "البرنامج التعليمي"

(2) إجراء استعلام SQL التالي:

CREATE TABLE impressions_by_day (
    advertiser_id SERIAL NOT NULL,
    day DATE NOT NULL DEFAULT CURRENT_DATE,
    impressions INTEGER NOT NULL,
        PRIMARY KEY (advertiser_id, day)
);

CREATE OR REPLACE FUNCTION insert_table()
  RETURNS void AS
$BODY$DECLARE
    _impressions_by_day impressions_by_day;
BEGIN
    INSERT INTO impressions_by_day(impressions ) VALUES(888) RETURNING  * INTO _impressions_by_day;

    RAISE NOTICE 'After insert, the returned advertiser_id is %', _impressions_by_day.advertiser_id;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION insert_table() OWNER TO postgres;

(3) إنشاء قاعدة بيانات تسمى "Tutorial_Partition"

(4) إجراء استعلام SQL التالي:

CREATE TABLE impressions_by_day (
    advertiser_id SERIAL NOT NULL,
    day DATE NOT NULL DEFAULT CURRENT_DATE,
    impressions INTEGER NOT NULL,
        PRIMARY KEY (advertiser_id, day)
);

CREATE OR REPLACE FUNCTION insert_table()
  RETURNS void AS
$BODY$DECLARE
    _impressions_by_day impressions_by_day;
BEGIN
    INSERT INTO impressions_by_day(impressions ) VALUES(888) RETURNING  * INTO _impressions_by_day;

    RAISE NOTICE 'After insert, the returned advertiser_id is %', _impressions_by_day.advertiser_id;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION insert_table() OWNER TO postgres;

CREATE TABLE impressions_by_day_y2010m1ms2 (
    PRIMARY KEY (advertiser_id, day), 
    CHECK ( day >= DATE '2010-01-01' AND day < DATE '2010-03-01' )
) INHERITS (impressions_by_day);


CREATE INDEX impressions_by_day_y2010m1ms2_index ON impressions_by_day_y2010m1ms2 (day);


CREATE OR REPLACE FUNCTION impressions_by_day_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
    IF ( NEW.day >= DATE '2010-01-01' AND NEW.day < DATE '2010-03-01' ) THEN 
        INSERT INTO impressions_by_day_y2010m1ms2 VALUES (NEW.*); 
    ELSE
        RAISE EXCEPTION 'Date out of range.  Something wrong with the impressions_by_day_insert_trigger() function!';
    END IF;
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER insert_impressions_by_day_trigger 
    BEFORE INSERT ON impressions_by_day 
    FOR EACH ROW EXECUTE PROCEDURE impressions_by_day_insert_trigger();

(5) تنفيذ

SELECT * FROM insert_table() on tutorial

نحن نحصل

إشعار: بعد الإدراج ، فإن المعلن الذي تم إرجاعه هو 1

(6) تنفيذ

SELECT * FROM insert_table() on tutorial_partition

نحن نحصل

إشعار: بعد الإدراج ، فإن المعلن العائد هو

كيف يمكن الحصول على Advertiser_id هو 1 أيضًا ، في Tutorial_Partition؟

هل كانت مفيدة؟

المحلول

يمر الزناد الخالي من الفرق ، مما يشير إلى الإدراج أنه لا يوجد إجراء يجب القيام به. نظرًا لعدم تنفيذ أي إجراء ، فإن بند * Returning * لا يعيد شيئًا. لن تكون قادرًا على اعتراض (وتجاوز) الإدراج و استخدم العودة في نفس العملية واحصل على أي شيء ذي معنى.

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