2017-03-22 12 views
1

私は、データベースはこのクエリつのプライマリキーSQLなどの2つの列を結合する方法を

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) 
); 

のようなIDカードの表が含まれているが、IDカードが同じN_CARDを持つことができるだけでなく、さまざまISSUE_DATEとidを持っています同じISSUE_DATEを持つことができますが、異なるN_CARDを持つことができるので、2つのidカードに同じN_CARDISSUE_DATEを同時に設定することはできません。このテーブルのSQLソースSQLワークベンチ/ jに

は、私はこのクエリ

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; 

このエラーを実行すると

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); 

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] 

の質問はどのように表現するためにされていますデータベースの状況ですか?しかし

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_DT_CLIENT_INDEX_8 
    ON ID_CARD (N_CARD ASC, ISSUE_DATE ASC); 
+2

だ 任意の最適化を解かれ、このクエリ

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) ); 

と私の問題を解決コード?それはあなたが望むことをする正しい方法のようです。 –

+0

エラーが表示されます。同じN_CARDのIDカードを2枚挿入し、別の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); 

なぜこれらが作成されているのかわかりませんが、削除する必要があります。

+0

この場合のASCの使用方法は同じです –

+0

N_CARDとISSUE_DATEのユニークなインデックスは同じです@Mark Adelsberger –

+0

@ A.Ilyes - なぜインデックス列が定義されたのかはわかりません。コードに不要な変更を加えずに問題に対処しています。 –

0

あなたの最初のcreate table文はあなたが望むもののために正確であるとは、単一の一意のインデックスが必要

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); 

その代わりに2つのユニークインデックスの

0

こんにちは、私は、これは良い解決策であるかどうかを知りませんが、私の問題は、あなたと間違っている何私はここ