我需要为具有两个字段(电子邮件、alternative_email(的表创建唯一索引。这意味着一个电子邮件地址只能在两列中被提及一次。另外,备选电子邮件也可以为空。
CREATE TABLE customers (
id serial PRIMARY KEY,
email VARCHAR (255) NOT NULL,
alternative_email VARCHAR (255) NOT NULL default ''
);
数据:
insert into customers (email, alternative_email)
values ('test@example.com', ''); - ok
insert into customers (email, alternative_email)
values ('test1@example.com', 'test@example.com');
不应插入第二行,因为alternative_email='test@example.com'
已在第一行中提到为email
。
如何创建索引来做到这一点?
不能像那样在两列之间创建索引。你需要做的是改变你的设计,使电子邮件都在不同的表中的一列中。
所以你可以有一个名为emails
的表,类似于:
CREATE TABLE emails (
id serial PRIMARY KEY,
email VARCHAR (255) NOT NULL UNIQUE,
);
然后有一个多对多的表格,将客户映射到电子邮件:
CREATE TABLE customer_emails (
customer_id INTEGER NOT NULL REFERENCES customers(id),
email_id INTEGER NOT NULL UNIQUE REFERENCES emails(id),
alternative boolean NOT NULL DEFAULT FALSE,
PRIMARY KEY (customer_id, email_id)
);
CREATE UNIQUE INDEX customer_email_idx ON customer_emails(customer_id, alternative);
这强制要求两个不同的客户不能重复使用相同的电子邮件地址,一个客户最多可以有一个主电子邮件地址和一个备用电子邮件地址,并且同一个电子邮件地址不能同时用于同一客户的主邮件地址和备用电子邮件地址。