あなたは必要ありません
member_id SERIAL NOT NULL, UNIQUE, PRIMARY KEY
A は自動的に次のことをPRIMARY KEY
意味します。UNIQUE NOT NULL
member_id SERIAL PRIMARY KEY
ハードコーディングされた最大長varchar(20)
. text
最大長を強制する必要がある場合は、チェック制約を使用して追加するだけです。着替えやすくなりました。
の構文INHERITS
が壊れています。キーワードは、列を囲む括弧の外に出ます。
CREATE TABLE full_member (
activities text[]
) INHERITS (members);
テーブル名に一貫性がありません ( members
<-> member
)。テストケースのどこでも単数形を使用しています。
最後に、タスクに RULE を使用しません。トリガーAFTER UPDATE
が望ましいようです。
次のことを考慮してください
テストケース:
テーブル:
CREATE SCHEMA x; -- I put everything in a test schema named "x".
-- DROP TABLE x.members CASCADE;
CREATE TABLE x.member (
member_id SERIAL PRIMARY KEY
,first_name text
-- more columns ...
,type text);
CREATE TABLE x.basic_member (
activities text[3]
) INHERITS (x.member);
CREATE TABLE x.full_member (
activities text[]
) INHERITS (x.member);
トリガー機能:
データ変更 CTE ( WITH x AS ( DELETE ..
) は、この目的に最適なツールです。PostgreSQL 9.1 以降が必要です。
古いバージョンの場合は、最初INSERT
にDELETE
.
CREATE OR REPLACE FUNCTION x.trg_move_member()
RETURNS trigger AS
$BODY$
BEGIN
CASE NEW.type
WHEN 'basic' THEN
WITH x AS (
DELETE FROM x.member
WHERE member_id = NEW.member_id
RETURNING *
)
INSERT INTO x.basic_member (member_id, first_name, type) -- more columns
SELECT member_id, first_name, type -- more columns
FROM x;
WHEN 'full' THEN
WITH x AS (
DELETE FROM x.member
WHERE member_id = NEW.member_id
RETURNING *
)
INSERT INTO x.full_member (member_id, first_name, type) -- more columns
SELECT member_id, first_name, type -- more columns
FROM x;
END CASE;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
引き金:
AFTER
これはトリガーであり、WHEN
条件
があることに注意してください。WHEN
条件には PostgreSQL 9.0 以降が必要です。以前のバージョンでは、そのままにしておくことができ、トリガー自体の CASE ステートメントがそれを処理します。
CREATE TRIGGER up_aft
AFTER UPDATE
ON x.member
FOR EACH ROW
WHEN (NEW.type IN ('basic ','full')) -- OLD.type cannot be IN ('basic ','full')
EXECUTE PROCEDURE x.trg_move_member();
テスト:
INSERT INTO x.member (first_name, type) VALUES ('peter', NULL);
UPDATE x.member SET type = 'full' WHERE first_name = 'peter';
SELECT * FROM ONLY x.member;
SELECT * FROM x.basic_member;
SELECT * FROM x.full_member;