1

次のスキームを持つ単純なテーブルがあります。

CREATE TABLE dateien(
    id int PRIMARY KEY UNIQUE DEFAULT NEXTVAL('dateien_id_seq'),
    name varchar(64),
    zeit timestamp DEFAULT now(),
    groesse float,
    dateityp_id int references dateitypen(id),
    benutzer_id int references benutzer(id)
);

phppgadmin を介して行を削除しようとすると、常に次のメッセージが表示されます。 No unique identifier for this row.

また、純粋なSQLを介して、deleteステートメントの後に効果はありません。何が問題なのか教えていただけますか?

4

2 に答える 2

1

くそっ… 間違いを見つけた。このテーブルでもアクティブになっているトリガーについて言及するのを忘れていました。トリガーは次のとおりです。

CREATE TRIGGER update_quota BEFORE INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_update_quota();

しかし、削除するときに何か間違ったものを返しました。それが機能していなかった理由です。

于 2012-06-19T08:42:01.453 に答える
0

参照されているテーブルがどのように作成されているかわかりません。

dateityp_id int references dateitypen(id),
benutzer_id int references benutzer(id)

したがって、例として...を推測することしかできません。テーブル 商品,注文,デートエン.

商品を参照する注文が作成された後に商品が削除された場合はどうなりますか? SQL では、それも指定できます。直感的に、いくつかのオプションがあります。

  • 参照された製品の削除を禁止します。
  • 注文も削除
  • 他の何か?

(dateien を介して) 注文でまだ参照されている製品を誰かが削除したい場合、それは許可されません。誰かが注文を削除すると、dateien も削除されます。

product_no integer REFERENCES products ON DELETE RESTRICT,
order_id integer REFERENCES orders ON DELETE CASCADE,

削除の制限とカスケードは、最も一般的な 2 つのオプションです。RESTRICT は NO ACTION と記述することもでき、何も指定しない場合のデフォルトでもあります。主キーが削除されたときに外部キー列がどうなるかについては、他に 2 つのオプションがあります。SET NULL と SET DEFAULT です。これらは、制約を遵守することを免除するものではないことに注意してください。たとえば、アクションで SET DEFAULT が指定されているが、デフォルト値が外部キーを満たさない場合、主キーの削除は失敗します。

詳細情報: http://www.postgresql.org/docs/7.4/static/ddl-constraints.html

于 2012-06-18T21:05:38.203 に答える