Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将两列合并为一个主键sql_Sql_H2db - Fatal编程技术网

如何将两列合并为一个主键sql

如何将两列合并为一个主键sql,sql,h2db,Sql,H2db,我有一个数据库,其中包含一个类似于此查询的身份证表 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) ); INSERT INTO ID_CAR

我有一个数据库,其中包含一个类似于此查询的身份证表

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)
);
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;
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)
);
但是一张身份证可以有相同的
N\u卡
但有不同的
发放日期
,而且一张身份证可以有相同的
发放日期
,但不同的
N\u卡
,因此两张身份证不能同时有相同的
N\u卡
发放日期

使用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);
当我执行这个查询时

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)
);
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;
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)
);
这个错误

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

您的第一个
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 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)
);
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;
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)
);
我不知道这是否是一个好的解决方案,但我的问题已经解决了
这里有任何优化

您的代码有什么问题?这似乎是做你想做的事情的正确方法。当我插入两张具有相同N_卡和不同发行日期的id卡时出现的错误是什么?唯一索引或主键冲突:“FKEY_N_卡客户索引8 ON PUBLIC.id_卡(N_卡)值('101215',9');SQL语句:将值('101215',日期'2019-11-11','DL')[23505-193][SQL State=23505,DB Errorcode=23505]插入ID_卡(N_卡,发行日期,ID_类型)在这种情况下,ASC的用途是什么?同样的问题N_卡和发行日期的唯一索引保持@MarkAdelsberger@A.Ilyes-我不想知道为什么索引列被定义为这样;我正在解决这个问题,没有对问题进行不必要的更改code@A.Ilyes-如果问题仍然存在,我认为您没有删除单独的唯一索引。默认情况下,使用db管理系统创建单独的唯一索引,但当我添加一个新列时,该索引包含整数自动增量,并添加N卡并发出唯一密钥,问题已解决,谢谢