2012-06-18 28 views
1

我有下面的方案一个简单的表:”此行没有唯一标识符。“在Postgres里当试图删除一行

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

+1

你的意思是“*在删除语句后没有效果*吗?你得到一个错误吗?你有没有提交你的删除?它在哪里没有”效果“。 –

+0

当我输入:'delete from dateien where id = 1;'我只是'没有找到行'。并且有一行带有这个标识 – soupdiver

+0

有没有机会通过这个名称在不同的模式下拥有多个表? – kgrittn

回答

1

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

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

但是,当删除我返回了什么错误。这就是为什么它不起作用。

0

我看不到如何创建引用的表。

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

因此,我只能猜测......,作为一个例子。表产品,订单,日期。

如果在创建引用它的订单后删除产品,该怎么办? SQL允许你指定。直观地说,我们有几个选项:

  • 不允许删除被引用的产品。
  • 删除订单以及
  • 还有其他吗?

当有人想要删除仍被订单引用的产品(通过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

+0

这不是问题,我在我的答案中描述了我忘了提及的东西,但无论如何,谢谢! – soupdiver