“此行没有唯一标识符。”在Postgres尝试删除一行时

时间:2012-06-18 18:52:25

标签: sql postgresql

我有一个简单的表,其中包含以下方案:

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语句后没有效果。 你能告诉我这是什么问题吗?

2 个答案:

答案 0 :(得分:1)

啊,该死的......我发现了错误。我忘了提一个在这张桌子上也有效的触发器。触发器是:

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

但是当删除时我返回了一些错误的内容。这就是它无法正常工作的原因。

答案 1 :(得分: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,

限制和级联删除是两种最常见的选项。 RESTRICT也可以写为NO ACTION,如果你没有指定任何内容,也是默认值。当删除主键时,还有两个其他选项可用于外键列:SET NULL和SET DEFAULT。请注意,这些不能免除您观察任何约束。例如,如果操作指定SET DEFAULT但默认值不满足外键,则删除主键将失败。

更多信息:http://www.postgresql.org/docs/7.4/static/ddl-constraints.html