我想知道这个例子
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
city
as的定义在varchar(80)
这里重复。PostgreSQL 有没有语法允许不重复varchar(80)
,只根据自己references cities(city)
来创建天气表?
没有办法做到这一点。而且,坦率地说,我认为没有必要。
请记住,引用列和引用列不必共享相同的数据类型。它们只需要
=
在它们之间定义一个运算符。如果您的目标是缩短语法,您可以省略引用列的列(或列列表),如果它是 PK:
示例中的数据类型兼容但不相同(
text
vs.varchar(80)
),引用的列假定为表的主键cities
。我引用手册
CREATE TABLE
:您可以避免重复类型定义,但 SQL 不会通过读取外键引用的类型来推断要使用的类型。
SQL标准方式
CREATE DOMAIN
允许您创建一个域(duh),文档将其描述为“本质上是一种具有可选约束的数据类型”。所以,在你的情况下,你可以做这样的事情。
然后,在您的表定义中,您可以使用 CITY_NAME 而不是 varchar(80)。
PostgreSQL 还支持 CHECK() 约束作为 CREATE DOMAIN 语句的一部分。
如果必须更改定义,您可以转储数据,在一处更改 CREATE DOMAIN 语句,删除数据库,重建模式,然后重新加载数据。我认为您不能更改正在使用的域,但我可能是错的。30 年来,我只需要这样做三四次。
非标准的代码极客方式
C语言有预处理器。缺少预处理器的语言可以使用m4。
m4 为您提供了比 SQL 的 CREATE DOMAIN 更大的灵活性,但它的范围更广。有时这是一件好事,有时则不然。最重要的区别是 m4 会在任何地方寻找像“CITY_NAME”这样的标记,而不仅仅是在需要数据类型声明的地方。仔细考虑的命名约定有很大帮助。
定义宏及其替换。然后像上面一样编写 CREATE TABLE 语句。
当你通过 m4 运行它时,你应该得到一个 CREATE TABLE 语句,它用“varchar(80)”代替“CITY_NAME”,就像这样。