postgresql - 如何检查两列中至少一列是否填充了数据?
问题描述
我有一张桌子来保存带有翻译和发音的短语。
我对提供一个不感兴趣translation
(这就是我在翻译列上删除 NOT NULL 的原因),但我想pronunciation
为所有插入提供一个。
CREATE TABLE phrase (
id SERIAL UNIQUE PRIMARY KEY,
phrase TEXT NOT NULL,
translation TEXT,
pronunciation TEXT,
created timestamptz NOT NULL DEFAULT now(),
modified timestamptz,
);
然而,其他用户可能想要添加 atranslation
而不是 a pronunciation
,或者他们想要用数据填充两列。这取决于他们。
但是,我希望至少提供其中一列。
“无论你给用户提供什么,atranslation
或a pronunciation
,至少提供两者之一。如果两者都为空,则不插入。如果其中一个被填充,则执行插入。”
我可以使用 PHP 在服务器端进行此检查和验证,但我在想是否最好在数据库端进行检查。我读到了一些关于这个的东西:
constraint chk_fields check (translation is not null or pronunciation is not null)
但我不知道在CREATE TABLE
声明中添加它的位置。我可以重新创建整个表,这不是问题。
解决方案
如果您想这样称呼它,只需将其添加为另一个“列表项”。
CREATE TABLE phrase (
id SERIAL UNIQUE PRIMARY KEY,
phrase TEXT NOT NULL,
translation TEXT,
pronunciation TEXT,
created timestamptz NOT NULL DEFAULT now(),
modified timestamptz,
constraint chk_fields check (translation is not null or pronunciation is not null)
);
您还可以使用ALTER TABLE
语句将约束添加到现有表。
ALTER TABLE phrase
ADD CONSTRAINT chk_fields
CHECK (translation IS NOT NULL
OR pronunciation IS NOT NULL);
(数据必须已经满足要求。)
推荐阅读
- c# - 如何在删除多条记录中最小化 C#、LINQ 代码
- python - 具有周期性边界条件的 NumPy N-dim 数组
- mongodb - 无法导入 MongoDB 公共 GPG 密钥:“连接超时”
- javascript - 文本框光标在网页中不可见
- windows - docker :manifest for microsoft/windowsservercore:latest not found
- sql - 如何在 BigQuery SQL 中添加数组?
- teradata - 与默认连接相比,Teradata FastExport 中的查询执行速度较慢
- android - android自定义键盘在移除手指时从弹出窗口中选择一个键
- android - 将横幅说明从英里更改为米或公里
- sql - 将“tail”附加到多个选择中