генерируемые последовательностью первичные ключи, кажется, не работают хорошо с операторами выбора - PullRequest
2 голосов
/ 19 марта 2020

генерируемые последовательностью первичные ключи, кажется, плохо работают с операторами выбора

Я пытаюсь создать транспортную базу данных. Я уже сделал это в 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) Я не могу выполнить вставку, даже если я не нарушаю ограничения целостности

1 Ответ

5 голосов
/ 19 марта 2020

generatedDriverNumber в вашем триггере определяется как char(15) - фиксированная длина символьное поле длиной 15. Поскольку вы заполняете его намного более коротким значением, оно дополняет его до полного длина 15. Это объясняет, почему запросы с like в начале значения работали, а не с =.

Чтобы короче говоря, измените определение на varchar2 и все должно быть в порядке:

generatedDriverNumber varchar2(15);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...