sql - 如何保证一张表只有一行一列?
问题描述
使用 PostgreSQL 11.5。我需要允许一个表只允许其中的一行和一列(不是 0 或 2,正好是 1)。我觉得ADD CONSTRAINT
会有用,但我不知道该怎么做。
我希望能够在需要时更新这一行。
使以下内容有效的东西:
foo
-----
bar
但不是以下内容:
foo | baz
-----+-----
bar | bin
-----+-----
| gar
解决方案
您可以强制一个表只有一行CHECK
对您的主键(或任何其他唯一且不可为空的列)设置约束,如下所示:
ALTER TABLE <tablename> ADD CONSTRAINT [<name>] CHECK ([pk/unique field] = [constant value]);
无论如何,由于您想要一个可更新的字段,您需要使用一个包含 2 列的表。如果您真的只需要一行(并且foo
为此目的仅选择或创建视图不是一种选择),您还可以在插入和删除时使用触发器(并通过引发异常来拒绝其中的任何操作)。为避免出现空表(不确定是否需要),您还需要在删除时使用此触发器,约束不够强。有关触发器,请参见此处:https ://www.postgresql.org/docs/current/triggers.html
要避免任何进一步ALTER TABLE
的命令(例如添加列)和DROP TABLE
,请使用事件触发器。有关更多信息,请查看文档:https ://www.postgresql.org/docs/current/event-triggers.html
对于使用带有触发器的 PL/pgSQL,还可以查看https://www.postgresql.org/docs/current/plpgsql-trigger.html
推荐阅读
- c++ - 未定义对“con(double)”collect2.exe 的引用:错误:ld 返回 1 退出状态
- python - 编写一个函数来修改列表中的字符串
- authentication - .Net Core 中的动态“AddAuthentication()”凭据可能吗?
- c - 存储大小未知结构错误
- apache-spark - Spark createOrReplaceTempView 成本或性能以及其他影响
- sqlite - Xamarin Forms 将列表添加到 SQL 数据库
- apache2 - 如何在 Raspberry Pi 3 上同时启用 Web 服务器和 webdav 服务器?
- python - 刮“强”类 Scrapy
- c# - SceneManager.LoadScene 不适用于开发移动构建
- c# - 将工作表从 Excel 文件复制到新的 Excel 文件