0

だから私は 3 つの外部キーを持つテーブル ActorInMovies を持っています。

CREATE TABLE ActorInMovie(
    ID_ROLE bigserial REFERENCES Role(ID_ROLE) ON DELETE CASCADE,
    ID_ACTOR bigserial REFERENCES Actor(ID_Actor) ON DELETE CASCADE,
    ID_MOVIE bigserial REFERENCES Movie(ID_Movie) ON DELETE CASCADE,
    CONSTRAINT ActorInMovie_pk PRIMARY KEY (ID_ROLE));

次のようなものを挿入しようとすると、次のようになります。

INSERT INTO ActorInMovie (ID_ROLE, ID_ACTOR) values (1,1);

ID_MOVIE が指定されていないためエラーになります (null だと思います)。ただし、1 から始まるインデックスの割り当てが自動的に開始されます。

私は何を間違っていますか?ここに書かれているように、「PostgreSQL は主キーと一意制約には自動的にインデックスを作成しますが、外部キー関係の参照側には作成しない」と考えました。

4

2 に答える 2

5

serial(またはbigserial列が別の列を参照するユースケースを想像するのは非常に困難です。通常は逆です。serial列は外部キー制約の反対側にある必要があります。

の代わりにmovie_idが必要なデザインを想像するのも同様に困難です。この地球上には十分な数の映画がありません。bigintint

movie_idまた、というテーブルで呼び出される列actor_in_movieを として定義する必要がある可能性も十分にありますNOT NULL

要するに、あなたのデザインがまったく飛ぶとは思えません。たぶん次のようなもの:

CREATE TABLE actor (actor_id serial PRIMARY KEY, actor text, ...);
CREATE TABLE movie (movie_id serial PRIMARY KEY, movie text, ...);
CREATE TABLE actor_in_movie(
   role_id  serial PRIMARY KEY
  ,actor_id int NOT NULL REFERENCES actor(actor_id) ON DELETE CASCADE
  ,movie_id int NOT NULL REFERENCES movie(movie_id) ON DELETE CASCADE
);

NOT NULL列が主キーに含まれている間、制約は冗長です。

おそらく、 のインデックス onactor_idと onmovie_idが必要actor_in_movieです。

詳細:

于 2013-11-04T21:05:30.610 に答える
3

これはbigserial、宣伝されているとおりに機能しています。外部キー制約やインデックスとは関係ありません。

于 2013-11-04T20:05:09.177 に答える