如何才能实现数据库中没有 2 条相同的记录且这 3 列的值组合相同?
@Column()
sector: string;
@Column()
row: string;
@Column()
number: string;
Run Code Online (Sandbox Code Playgroud) 这是我的约束:
CREATE UNIQUE INDEX index_subscriptions_on_user_id_and_class_type_id_and_deleted_at
ON subscriptions
USING btree
(user_id, class_type_id, deleted_at);
Run Code Online (Sandbox Code Playgroud)
此查询证明约束实际上不起作用:
SELECT id, user_id, class_type_id,deleted_at
FROM subscriptions;
Run Code Online (Sandbox Code Playgroud)
这是输出:

为什么没有强制执行唯一性?
在 Postgres 10 中我声明了以下内容:
create table test_abc (
pk integer not null,
id integer not NULL,
id2 integer not null,
PRIMARY KEY (pk)
);
CREATE UNIQUE INDEX test_abc_ids ON test_abc(id,id2);
Run Code Online (Sandbox Code Playgroud)
然后是第二个表,其中 FK 引用第一个表:
create table test_def (
id integer not null,
abc_id integer,
abc_id2 integer,
PRIMARY KEY (id),
FOREIGN KEY (abc_id,abc_id2) references test_abc(id,id2)
);
Run Code Online (Sandbox Code Playgroud)
现在考虑此查询的输出:
SELECT unique_constraint_catalog, unique_constraint_schema, unique_constraint_name
FROM information_schema.referential_constraints r
WHERE r.constraint_name = 'test_def_abc_id_fkey'
----------------------
NULL NULL NULL
Run Code Online (Sandbox Code Playgroud)
所有unique_constraint_*列都有空值。
从Postgres 文档看来这些元列应该包含
包含外键约束引用的唯一或主键约束的 [object] 的名称(始终是当前数据库) …
sql postgresql foreign-keys information-schema database-metadata
是否有区别:
CREATE TABLE p(
product_no integer,
name text UNIQUE,
price numeric
);
Run Code Online (Sandbox Code Playgroud)
和:
CREATE TABLE p(
product_no integer,
name text,
price numeric
);
CREATE UNIQUE INDEX customername
ON p
USING btree
(name COLLATE pg_catalog."default");
Run Code Online (Sandbox Code Playgroud)
在这两种情况下名称都是唯一的吗?当索引唯一时意味着什么?
编辑:Postgres 唯一约束与索引没有回答我的问题。它考虑了 FK 的情况。我的问题与 FK 无关。我只想知道这两个操作在这个不涉及 FK 的例子中是否等效。
我知道如果数据是唯一的,理论上唯一索引会比非唯一索引更快。
因为唯一索引能够提供更多的信息,让查询优化器选择更有效的执行计划。
我正在做一些测试,想证明唯一索引可能比执行计划中的非唯一索引更好,但结果显示它们是相同的......
CREATE TABLE T3(
ID INT NOT NULL,
val INT NOT NULL,
col1 UUID NOT NULL,
col2 UUID NOT NULL,
col3 UUID NOT NULL,
col4 UUID NOT NULL,
col5 UUID NOT NULL,
col6 UUID NOT NULL
);
CREATE INDEX IX_ID_T3 ON T3 (ID);
CREATE UNIQUE INDEX UIX_ID_T3 ON T3 (ID);
INSERT INTO T3
SELECT i,
RANDOM() * 1000000,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid
FROM generate_series(1,1000000) …Run Code Online (Sandbox Code Playgroud) postgresql ×5
sql ×2
foreign-keys ×1
indexing ×1
nestjs ×1
typeorm ×1
typescript ×1
unique-index ×1