2013-04-21 33 views
0

我有PostgreSQL - customercreditcard中的兩個表。客戶可以擁有多張信用卡,不同的客戶可以擁有與其賬戶相關的同一張信用卡。但是,客戶不應該能夠多次使用與其帳戶相關的同一張信用卡。因此,在creditcard表中,cardnumbercustid的組合代表了我想用於主鍵的唯一鍵。沒有唯一的約束匹配給定的鍵

但是,我收到以下錯誤:ERROR: there is no unique constraint matching given keys for referenced table "creditcard"。將UNIQUE添加到creditcard表中cardnumber聲明的末尾可以解決此問題,但我希望相同的卡號能夠與多個帳戶關聯,因此這不是一個可接受的解決方案。我在這個主題上的大部分搜索都是關於外鍵的討論,但我沒有看到我的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) 
    ); 
+0

錯誤消息與您發佈的SQL不匹配。您顯示的SQL不會爲信用卡表創建任何外鍵引用**。如果數據類型'cardtype'被刪除,SQL工作正常:http://sqlfiddle.com/#!12/3a9ba/1 – 2013-04-21 20:13:54

+0

@a_horse_with_no_name:彗星在前面。對於其餘的我傾向於同意。 – wildplasser 2013-04-21 20:16:50

+0

順便說一下:在CHAR(1)替換CARDTYPE後,代碼在這裏工作(Pg-9.1)。你的版本是什麼? – wildplasser 2013-04-21 20:25:03

回答

2

我沒有一個數據庫方便,但是這是我會怎樣佈局表,允許客戶有一個以上的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) 
); 
+0

對於1:N關係,交接表不需要*。只要一個普通的FK約束就足夠了。 – wildplasser 2013-04-21 20:21:52

+0

@wildplasser:如果我瞭解Q權利,似乎是n:m。 – 2013-04-21 20:31:09

+0

是的,你們都是對的。抱歉!在這種情況下,junctiontable看起來比複合PK更清潔。 – wildplasser 2013-04-21 20:38:13

相關問題