gpt4 book ai didi

sql - 如何在 Multi-Tenancy 数据库中使字段 NOT NULL

转载 作者:行者123 更新时间:2023-11-29 14:02:57 24 4
gpt4 key购买 nike

这是一个 Multi-Tenancy 应用。所有记录都有一个客户 ID 来分隔客户数据。客户可以在此表中插入自己的数据,并设置自己的字段可为空或不为空。因此,设置整个字段不为空是行不通的。我需要为特定的客户端 ID 设置一个空字段。

我目前正在查询数据库以检查该值是否为空。在 INSERT 上,我检查插入值是否为空,如果是,我会抛出错误。我希望数据库进行所有这些检查。这在像这样的 Multi-Tenancy 数据库中可能吗?

此外,我需要有关 SQL Server、oracle 和 postgresql 的建议。谢谢

最佳答案

使用 Postgresql 至少你可以用 table inheritance 做到这一点.

您可以为这个特定的客户端定义一个包含所需约束的继承表。

考虑以下示例:

psql=> CREATE TABLE a(client INT NOT NULL, id SERIAL, foo TEXT);
CREATE TABLE

psql=> CREATE TABLE b(foo TEXT NOT NULL, CHECK (CLIENT=1) ) INHERITS (a);
NOTICE: moving and merging column "foo" with inherited definition
DETAIL: User-specified column moved to the position of the inherited column.
CREATE TABLE

psql=> INSERT INTO b(client,foo) VALUES (1,'a');
INSERT 0 1

psql=> INSERT INTO b(client,foo) VALUES (1,NULL);
ERROR: null value in column "foo" violates not-null constraint
DETAIL: Failing row contains (1, 2, null).

本例中的表“b”继承自“a”,但对列“foo”有不同的定义,包括非空约束。另请注意,我使用了检查约束来确保只有客户端 1 的记录才能进入此表。

为此,您的应用程序必须更新以将客户记录插入正确的表中,或者您需要编写一个自动执行此操作的触发器。 partitioning 上的手册部分给出了如何执行此操作的示例。 .

您的应用程序仍然可以对父表(我的示例中的“a”)进行查询并获取所有客户端的记录,包括子表中的任何记录。

关于sql - 如何在 Multi-Tenancy 数据库中使字段 NOT NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40856650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com