2017-03-22 24 views
1

我有一個數據庫包含的ID卡的表像這樣的查詢如何兩列合併爲一個主鍵SQL

CREATE TABLE ID_CARD 
(
    N_CARD   VARCHAR(20) NOT NULL, 
    ISSUE_DATE  DATE NOT NULL, 
    ID_TYPE   VARCHAR(2) NOT NULL, 
    CONSTRAINT PKEY_ID_CARD PRIMARY KEY(N_CARD, ISSUE_DATE) 
); 

而是一個身份證可以有相同的N_CARD但不同ISSUE_DATE也一個id卡可以具有相同的ISSUE_DATE但是不同的N_CARD,因此兩張身份證不能同時具有相同的N_CARDISSUE_DATE

隨着SQL工作臺/ J的SQL源出於此表是

DROP TABLE ID_CARD; 

CREATE CACHED TABLE ID_CARD 
(
    N_CARD  VARCHAR(20) NOT NULL, 
    ISSUE_DATE DATE   NOT NULL, 
    ID_TYPE  VARCHAR(2) NOT NULL 
); 

ALTER TABLE ID_CARD 
    ADD CONSTRAINT PKEY_ID_CARD 
    PRIMARY KEY (N_CARD, ISSUE_DATE); 

CREATE UNIQUE INDEX FKEY_N_CARD_CLIENT_INDEX_8 
    ON ID_CARD (N_CARD ASC); 

CREATE UNIQUE INDEX FKEY_ISSUE_DATE_CLIENT_INDEX_8 
    ON ID_CARD (ISSUE_DATE ASC); 

當我執行此查詢

INSERT INTO ID_CARD (N_CARD, ISSUE_DATE, ID_TYPE) 
VALUES ('101215', DATE '2019-11-11', 'DL'); 
commit; 
INSERT INTO ID_CARD(N_CARD,ISSUE_DATE,ID_TYPE)VALUES('101215',DATE '2019-11-12','DL'); 
commit; 

此錯誤

Unique index or primary key violation: "FKEY_N_CARD_CLIENT_INDEX_8 ON 

PUBLIC.ID_CARD(N_CARD) VALUES ('101215', 9)"; SQL statement: 
INSERT INTO ID_CARD(N_CARD,ISSUE_DATE,ID_TYPE)VALUES('101215',DATE '2019-11-11','DL') [23505-193] [SQL State=23505, DB Errorcode=23505] 

的問題是如何表示在數據庫中的情況?

+2

有什麼問題你碼?這似乎是做你想做的事的正確方法。 –

+0

錯誤,我插入兩個身份證與相同的N_CARD和不同的ISSUE_DATE –

+0

你得到的錯誤是什麼? – squillman

回答

1

相反的兩個獨特的指標作爲

CREATE UNIQUE INDEX FKEY_N_CARD_CLIENT_INDEX_8 
    ON ID_CARD (N_CARD ASC); 

CREATE UNIQUE INDEX FKEY_ISSUE_DATE_CLIENT_INDEX_8 
    ON ID_CARD (ISSUE_DATE ASC); 

你需要一個唯一索引

CREATE UNIQUE INDEX FKEY_N_DT_CLIENT_INDEX_8 
    ON ID_CARD (N_CARD ASC, ISSUE_DATE ASC); 
+0

是什麼在這種情況下 –

+0

同樣的問題N_CARD和ISSUE_DATE的唯一索引使用ASC的保持@馬克Adelsberger –

+0

@ A.Ilyes - 我不自認知道爲什麼索引中的列被定義爲他們;我在解決問題時沒有對代碼進行不必要的更改 –

0

你的第一個create table說法是正確的,你想要什麼:

CREATE TABLE ID_CARD (
    N_CARD   VARCHAR(20) NOT NULL, 
    ISSUE_DATE  DATE NOT NULL, 
    ID_TYPE   VARCHAR(2) NOT NULL, 
    CONSTRAINT PKEY_ID_CARD PRIMARY KEY(N_CARD, ISSUE_DATE) 
); 

然而,唯一索引是不正確

CREATE UNIQUE INDEX FKEY_N_CARD_CLIENT_INDEX_8 ON ID_CARD (N_CARD ASC); 

CREATE UNIQUE INDEX FKEY_ISSUE_DATE_CLIENT_INDEX_8 ON ID_CARD (ISSUE_DATE ASC); 

我不知道爲什麼這些被創建,但你應該放棄它們。

0

您好我解決我的問題與此查詢

CREATE TABLE ID_CARD(
ID    INTEGER NOT NULL AUTO_INCREMENT, 
N_CARD   VARCHAR(20) NOT NULL, 
ISSUE_DATE  DATE NOT NULL, 
ID_TYPE   VARCHAR(2) NOT NULL, 
CONSTRAINT PKEY_ID_CARD PRIMARY KEY(ID), 
CONSTRAINT UI_ID_CARD UNIQUE INDEX(N_CARD,ISSUE_DATE) 
); 

我不知道這是不是一個很好的解決方案,但我的問題就解決了 任何優化,我在這裏