我在PostgreSQL
--customer
和中有两张桌子creditcard
。一个客户可以拥有多张信用卡,并且不同的客户可以拥有与其帐户关联的同一张信用卡。但是,客户不应多次将同一张信用卡与其帐户关联。因此,在creditcard
表中, 和 的组合cardnumber
代表custid
一个唯一键,我想将其用作主键。
但是,我收到以下错误:ERROR: there is no unique constraint matching given keys for referenced table "creditcard"
. 添加到表中声明UNIQUE
的末尾解决了这个问题,但我希望同一个卡号能够与多个帐户相关联,因此这不是一个可接受的解决方案。我在这个主题上的大部分搜索都会引发关于外键的讨论,但我没有看到我的外键有任何问题。有人可以帮我理解我做错了什么吗?cardnumber
creditcard
custid
请注意,这不是针对真实产品的,只是为了让我了解 SQL ——我不会使用此设置存储任何真实的 CC 编号。
CREATE SEQUENCE customeridseq INCREMENT BY 1 MINVALUE 100;
CREATE TABLE customer (
id INT NOT NULL PRIMARY KEY default nextval('customeridseq') --- this is a surrogate key (multiple customers can potentially have the same name...)
,username VARCHAR(20) NOT NULL UNIQUE
,fname VARCHAR(20) NOT NULL
,lname VARCHAR(20) NOT NULL
,emailaddress VARCHAR(20) NOT NULL UNIQUE
,birthdate INTERVAL YEAR TO MONTH NOT NULL
,passwordhash VARCHAR(64) NOT NULL -- assuming SHA-512 hash producing 64 bytes of data
);
CREATE type cardtype AS enum (
'Discover'
,'Visa'
,'MasterCard'
,'AmericanExpress'
);
CREATE TABLE creditcard (
cardnumber INT NOT NULL
,custid INT NOT NULL REFERENCES customer(id)
,cardtype CARDTYPE NOT NULL
,expirationdate INT NOT NULL
,billingaddress VARCHAR(40) NOT NULL
,PRIMARY KEY (custid, cardnumber)
);