【发布时间】:2014-07-31 21:00:38
【问题描述】:
我有一个 PostgreSQL 9.3 数据库,其中包含一个用户表,该表以保留大小写的格式存储用户名。所有查询都不区分大小写,所以我应该有一个支持它的索引。此外,无论大小写如何,用户名都必须是唯一的。
这是我想出的:
forum=> \d users
Table "public.users"
Column | Type | Modifiers
------------+--------------------------+------------------------
name | character varying(24) | not null
Indexes:
"users_lower_idx" UNIQUE, btree (lower(name::text))
以标准 SQL 语法表示:
CREATE TABLE users (
name varchar(24) NOT NULL
);
CREATE UNIQUE INDEX "users_lower_idx" ON users (lower(name));
有了这个架构,我已经满足了我的所有限制条件,尽管没有主键。 SQL标准不支持功能主键,所以不能提升索引:
forum=> ALTER TABLE users ADD PRIMARY KEY USING INDEX users_lower_idx;
ERROR: index "users_lower_idx" contains expressions
LINE 1: ALTER TABLE users ADD PRIMARY KEY USING INDEX users_lower_id...
^
DETAIL: Cannot create a primary key or unique constraint using such an index.
但是,我已经有了 UNIQUE 约束,并且该列已经被标记为“NOT NULL”。如果我必须有一个主键,我可以这样构造表:
CREATE TABLE users (
name varchar(24) PRIMARY KEY
);
CREATE UNIQUE INDEX "users_lower_idx" ON users (lower(name));
但是我将有两个索引,这对我来说似乎是浪费和不必要的。那么,除了“UNIQUE NOT NULL”之外,PRIMARY KEY 对 postgres 是否意味着任何特别的东西,我是否因为没有而错过了什么?
【问题讨论】:
-
您是否会拥有一个具有指向该表的外键的表?你的表只有一列吗?我想如果你的例子真的这么简单,那么你可能会侥幸逃脱。我以前在没有主键的环境中工作,那简直是一场噩梦。
-
还会有各种其他列,但为了简单起见,我在这里省略了它们。我确实打算让外键回到这个表,但是......嗯。我假设我可以引用具有唯一约束的列,但在这种情况下可能不是。让我试一试。 edit嘿,它确实有效!
标签: sql database postgresql database-schema postgresql-9.3