如何将两列合并为一个主键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卡并发出唯一密钥,问题已解决,谢谢