给定键没有唯一约束匹配

时间:2013-04-21 19:33:11

标签: sql postgresql postgresql-9.2

我在PostgreSQL - customercreditcard中有两个表格。客户可以拥有多张信用卡,不同的客户可以使用与其帐户相关联的相同信用卡。但是,客户不应该多次使用与其帐户相关联的相同信用卡。因此,在creditcard表中,cardnumbercustid的组合代表一个唯一键,我想将其用作主键。

但是,我收到以下错误: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)
    );

1 个答案:

答案 0 :(得分:2)

我没有方便的数据库,但这就是我如何布置表格以允许客户拥有多个cc,不同的人拥有相同的cc,但不允许同一个人拥有相同的cc cc不止一次。解决方案是规范化。它有不同的级别,通常你想要根据需要至少有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)
);