我有一个 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))
Run Code Online (Sandbox Code Playgroud)
用标准 SQL 语法表示:
CREATE TABLE users (
name varchar(24) NOT NULL
);
CREATE UNIQUE INDEX "users_lower_idx" ON users (lower(name));
Run Code Online (Sandbox Code Playgroud)
通过这个模式,我已经满足了所有的约束,尽管没有主键。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 …Run Code Online (Sandbox Code Playgroud)