0

我在PostgreSQL--customer和中有两张桌子creditcard。一个客户可以拥有多张信用卡,并且不同的客户可以拥有与其帐户关联的同一张信用卡。但是,客户不应多次将同一张信用卡与其帐户关联。因此,在creditcard表中, 和 的组合cardnumber代表custid一个唯一键,我想将其用作主键。

但是,我收到以下错误:ERROR: there is no unique constraint matching given keys for referenced table "creditcard". 添加到表中声明UNIQUE的末尾解决了这个问题,但我希望同一个卡号能够与多个帐户相关联,因此这不是一个可接受的解决方案。我在这个主题上的大部分搜索都会引发关于外键的讨论,但我没有看到我的外键有任何问题。有人可以帮我理解我做错了什么吗?cardnumbercreditcardcustid

请注意,这不是针对真实产品的,只是为了让我了解 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)
    );
4

1 回答 1

2

我手边没有数据库,但这就是我如何布置表格以允许客户拥有多个抄送,并且不同的人拥有相同的抄送,但不允许同一个人拥有相同的抄送超过一次。解决方案是标准化。它有不同的级别,通常您希望根据需要至少达到 3 级,有时甚至更高。肯定有一些艺术和科学可以根据情况正确地做到这一点。

CREATE TABLE customer 
(
    customer_id PRIMARY KEY
);

CREATE TABLE creditcard
(
    creditcard_id PRIMARY KEY,
    cardnumber --UNIQUE
);

create table customer_creditcard
(
  customer_creditcard_id PRIMARY KEY,
  customer_id,
  creditcard_id --UNIQUE (customer_id, creditcard_id)
);
于 2013-04-21T20:07:07.467 回答