1

我有一个数据库包含一个像这个查询一样的身份证表

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,身份证也可以相同ISSUE_DATE但不同N_CARD,因此两张身份证不能同时N_CARD相同ISSUE_DATE

使用 SQL Workbench/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]

问题是如何在数据库中表示这种情况?

4

3 回答 3

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);
于 2017-03-22T14:22:17.920 回答
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);

我不知道为什么要创建这些,但你应该放弃它们。

于 2017-03-23T01:34:50.020 回答
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)
);

我不知道这是否是一个好的解决方案,但我的问题已解决任何优化我在这里

于 2017-03-26T14:53:52.840 回答