2016-08-29 17 views
-2

関数を使用してgeneroテーブルのジャンルを削除する必要があります。しかし、私は関数を作成し、 "DELETから選択*" を実行し、メッセージを表示する場合:"genero"テーブルの更新または削除は、 "filme"テーブルの外部キー制約 "fk_genero_filme"に違反します

ERROR: update or delete on table "genero" violates foreign key constraint "fk_genero_filme" on table "filme" 
DETAIL: Key (id) = (1) is still referenced from table "movie". 

私のテーブル構造:

create table genero(
    id numeric(5) not null, 
    nome varchar(100), 
    constraint genero_pkey primary key (id) 
); 

create table filme(
    id numeric(5) not null, 
    nome varchar(100), 
    duracao varchar(100), 
    sinopse varchar(2000), 
    genero numeric(5), 
    data timestamp, 
    constraint pk_genero primary key (id), 
    constraint fk_genero_filme foreign key (genero) references genero (id) 
); 

削除機能:

CREATE OR REPLACE FUNCTION delet (id numeric(5)) 
RETURNS VOID AS 
$$ 
BEGIN 
    DELETE FROM genero; 
END; 
$$ 
LANGUAGE 'plpgsql' VOLATILE COST 100; 

関数呼び出し:

Select delet(6); 
+1

データベースの構造、データの例、完全なSQLクエリを表示してください。また、コードの書式を使用してください。 –

+0

create table genero( id数値(5)not null、nome varchar(100)、 制約genero_pkey主キー(id) ) VARCHAR(100)duracao、 sinopseのVARCHAR(2000)、generoの数値(5)、データのタイムスタンプ、主キー(ID)pk_genero 制約、外部キー(genero)参照genero(ID) )fk_genero_filme 制約は、CREATE OR REPLACE (6);選択を削除(6);選択を削除(6); FUNCTION削除(ID数値(5))$$ からBEGIN を削除する;終了; $$ LANGUAGE 'plpgsql' VOLATILE COST 100; –

答えて

0

OK、コードにいくつかの問題があります。

まず、WHERE句がないので、削除関数はすべての行を削除します。それは、より多くのようにする必要があります: - NO ACTION

第二
CREATE OR REPLACE FUNCTION delet(_id numeric) 
    RETURNS void AS 
$BODY$ 
BEGIN 
    DELETE FROM genero WHERE id = _id; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE COST 100; 

fk_genero_filme制約が(エラーで報告されているように)デフォルトの動作を持っています。これは、ジャンルを参照する少なくとも1つの映画がある場合、この特定のジャンルを削除できないことを意味します。あなたはそれがジャンルにDELETE予想した場合も、あなたはDELETE CASCADE ON使用する必要があり、このジャンルのすべての映画が削除されます:

ALTER TABLE filme 
    DROP CONSTRAINT fk_genero_filme; 
ALTER TABLE filme 
    ADD CONSTRAINT fk_genero_filme 
     FOREIGN KEY (genero) 
     REFERENCES genero (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE; 

をそして最後に、あなたの代わりに、パフォーマンス上の理由から、数値の整数としてIDを定義する必要があります。

関連する問題