首页 > 解决方案 > 如何检查两列中至少一列是否填充了数据?

问题描述

我有一张桌子来保存带有翻译和发音的短语。

我对提供一个不感兴趣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声明中添加它的位置。我可以重新创建整个表,这不是问题。

标签: postgresql

解决方案


如果您想这样称呼它,只需将其添加为另一个“列表项”。

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);

(数据必须已经满足要求。)


推荐阅读