假设我想要一个复合类型的地址,例如:
create type address as (
city text,
address_line text,
zip_code int
);
Run Code Online (Sandbox Code Playgroud)
为了使数据完整性更好,我不想允许NULL
s 成为city
、address_line
或 的成员zip_code
。所以我想对not null
这些字段进行限制。
创建域检查对我来说不起作用。所以这段代码会产生错误:
create domain address_domain as address
check (
value.city is not null and
value.address_line is not null and
value.zip_code is not null
);
Run Code Online (Sandbox Code Playgroud)
您可能会说:“那么,为什么不将地址存储为三列,并向字段添加约束呢?”。我会回答说,我希望能够使地址本身可以为空,但如果地址存在,那么它的所有字段也应该存在。像这样的东西:
create table companies (
id serial primary key,
name text not null,
headquaters address -- this one can be null tho
)
Run Code Online (Sandbox Code Playgroud) PostgreSQL 允许NULL
在标记为 的域中使用s NOT NULL
。这是为什么,文档是这么说的,
尽管存在这样的约束,但名义上属于域类型的列仍有可能读取为空。例如,如果域列位于外连接的可为空一侧,则这可能发生在外连接查询中。
这能更好地解释吗?
在 PostgreSQL 中显示表的列和约束是通过以下方式完成的:
\d+ <table_name>
Run Code Online (Sandbox Code Playgroud)
其中列出了表的列、数据类型和修饰符。
如何显示 Posgresql域的详细信息和约束?
PostgreSQL 支持DOMAIN
规范,来自 SQL 2011 工作草案规范,
域是命名的用户定义对象,可以在某些可以指定数据类型的地方将其指定为数据类型的替代。域由数据类型、可能是默认选项和零个或多个(域)约束组成。
这使我们能够做一些非常酷的事情,例如通过不区分大小写的文本类型为电子邮件实现HTML5 规范的域。它确保所有访问数据库的客户端都对插入的数据进行完整性检查。
CREATE DOMAIN email AS citext
CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' );
Run Code Online (Sandbox Code Playgroud)
SQL Server 是否支持触发器系统之外的任何此类功能?
我最近设置了一个在其上运行 SQL 实例的新服务器(2017 年),我能够使用 SSMS 远程连接到该服务器,但是当我尝试添加新登录名时,我收到附加的错误。两台机器都在同一个域中。
我之前已经做了一些研究,并在下面的配置中打开了端口 5002、5001、135 和 88。
我已经确认是防火墙的问题,关闭域防火墙就可以访问。
我错过了什么吗?
如果相关,服务器托管在 Azure 上
domain ×5
postgresql ×3
azure ×1
datatypes ×1
null ×1
sql-clr ×1
sql-server ×1
sql-standard ×1
ssms ×1