如何在PostgreSQL中强制列的默认值?

问题描述 投票:0回答:2

在INSERT / UPDATE期间,除了触发器之外是否有任何实际的方法可以忽略查询给定值而支持默认值?

这是我想要存档的行为:

CREATE TABLE foo (id serial, data text);

INSERT INTO foo (data) VALUES('bar1');
INSERT INTO foo (id, data) VALUES(50, 'bar2');
INSERT INTO foo (id, data) VALUES(-34, 'bar3');
INSERT INTO foo (id, data) VALUES(80.34, 'bar4');
INSERT INTO foo (id, data) VALUES('foo5', 'bar5');
INSERT INTO foo (data) VALUES('bar6');

UPDATE foo SET id=200, data='BARn' WHERE íd=6;

SELECT * FROM foo;

+----+------+
| id | data |
+----+------+
|  1 | bar1 |
|  2 | bar2 |
|  3 | bar3 |
|  4 | bar4 |
|  5 | bar5 |
|  6 | BARn |
+----+------+

谢谢!

postgresql default-value database-trigger
2个回答
1
投票

并不是的。一个触发器是去这里的方式。

好吧,你也可以使用条件rule。但我不会。 使用check constraints,您只能限制您不想要的值或其组合,但这会引发异常并完全跳过操作。


1
投票

你真的不应该这样做。

您应该以这样的方式编程,使您的代码不会表现得很奇怪。向数据库插入内容后,应插入此数据或引发错误。

您可以通过以下方式强制执行serial始终如一:

  • 使用后插入触发器检查NEW.id=curval('foo_id_seq')和更新后触发器是否检查NEW.id=OLD.id并在此检查失败时引发错误,但是由于某些奇怪的原因排除了触发器;
  • 为超级用户以外的用户禁用对此表的写访问权限并创建用于插入数据的函数: create function insert_to_foo(text)返回void,因为$$ insert插入foo(data)值($ 1); $$ language sql volatile security definer set search_path = public,pg_temp;
© www.soinside.com 2019 - 2024. All rights reserved.