PostgreSQL
--customer
とに 2 つのテーブルがあり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)
);