генерируемые последовательностью первичные ключи, кажется, плохо работают с операторами выбора
Я пытаюсь создать транспортную базу данных. Я уже сделал это в Access и MySQL. Сейчас я делаю это в Oracle, и я совершенно новичок в этом. У меня возникли проблемы с полем, сгенерированным последовательностью. Или, по крайней мере, я так думаю. Вы попадете на борт, когда прочитаете все это.
Вот код для моей таблицы driverRecords:
CREATE TABLE TRANSPORT_SCHEMA.driverRecords
(
driverReg varchar2(15) PRIMARY KEY,
driverIDNumber varchar2(10) UNIQUE,
surname varchar2(15) NOT NULL,
otherNames varchar2(30) NOT NULL,
address varchar2(20),
email varchar2(320) NOT NULL,
DOB date NOT NULL,
employmentDate date NOT NULL
);
Вот код для таблицы DrivingLicences:
CREATE TABLE TRANSPORT_SCHEMA.drivingLicences
(
licenceID varchar2(6) PRIMARY KEY,
vehicleClass varchar2(15),
issueDate date,
expiryDate date,
driverReg varchar2(15) UNIQUE,
CONSTRAINT fk_driverReg FOREIGN KEY(driverReg) REFERENCES driverRecords(driverReg),
CONSTRAINT Chk_vehicleClass CHECK(vehicleClass IN('A','B','C','D','E','F','G'))
);
Поэтому я пытался вставить записи в водительские права. driverReg в DrivingLicences является дочерним ключом для DriverReg в DriverRecords. Идея состоит в том, что ни один драйвер не должен существовать в таблице driveLicences, если их записи не существуют в таблице driverRecords
Вот код, который я использовал для вставки;
insert into drivingLicences VALUES('123456', 'D', '12-12-2019','12-12-2020', 'DRV/1003/2020');
И вот возвращаемая ошибка:
ORA-02291: integrity constraint (TRANSPORT_SCHEMA.FK_DRIVERREG) violated - parent key not found
Теперь я полностью согласен, что ошибка вызвана нарушением ограничения целостности ... Но проблема это ... У меня фактически есть драйвер с регистрационным номером DRV/1003/2020
в моих записях
Мои регистрационные номера драйвера генерируются этой последовательностью и запускают:
Последовательность :
CREATE SEQUENCE driverNumberSequence
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
Триггер:
CREATE OR REPLACE TRIGGER regNumberGenerator BEFORE
INSERT ON driverRecords
FOR EACH ROW
DECLARE
prefix char(3) := 'DRV';
driverNumber char(4);
postfix char(4);
generatedDriverNumber char(15);
BEGIN
SELECT TO_CHAR(SYSDATE, 'YYYY') INTO postfix FROM sys.dual;
SELECT TO_CHAR(driverNumberSequence.nextval) INTO driverNumber FROM dual;
generatedDriverNumber:= prefix || '/' || driverNumber || '/' || postfix;
SELECT TO_CHAR(generatedDriverNumber) INTO :NEW.driverReg FROM dual;
DBMS_OUTPUT.PUT_LINE('Driver Reg Number generated:' || generatedDriverNumber);
END;
Я попытался сделать два оператора select, чтобы выяснить, в чем проблема:
1) SELECT * FROM DRIVERRECORDS where DRIVERREG = 'DRV/1001/2020';
Этот возвращает 0 строк
2) SELECT * FROM DRIVERRECORDS where DRIVERREG LIKE 'DRV/1001/2020%';
Этот действительно вернул результат
Я понятия не имею, что я делаю неправильно. Но я думаю, что это связано с тем, как сохраняется информация о моем DriverReg. Любая помощь будет оценена
Если это поможет, вот все номера регистрационных номеров драйверов, которые я сохранил:
SELECT driverReg FROM driverRecords;
*DRV/1001/2020
DRV/1002/2020
DRV/1003/2020
DRV/1004/2020
DRV/1005/2020*
В двух словах, мне нужно знать, почему:
a) оператор select работает с LIKE '%'
, а не с = ''
b) Я не могу выполнить вставку, даже если я не нарушаю ограничения целостности