gpt4 book ai didi

sql - 序列生成的主键似乎不适用于select语句

转载 作者:行者123 更新时间:2023-12-02 09:03:43 25 4
gpt4 key购买 nike

序列生成的主键似乎不适用于select语句

我正在尝试创建运输数据库。我已经在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'))
);

所以我试图将记录插入DrivingLicences。 DrivingLicences中的driverReg是driverRecords中driverReg的子项。这个主意
如果驱动程序记录表中不存在驱动程序记录,则该驱动程序不应存在于driveLicences表中

这是我用来插入的代码;
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;

我试图做两个选择语句来弄清楚问题出在哪里:

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)即使我没有违反完整性约束也无法插入

最佳答案

触发器中的generatedDriverNumber定义为char(15)-长度为15的固定长度字符字段。由于用更短的值填充它,因此将其填充为最大长度15。这解释了为什么要使用like查询值的开头有效,但不能使用=

长话短说,将定义更改为varchar2,您应该可以:

generatedDriverNumber varchar2(15);

关于sql - 序列生成的主键似乎不适用于select语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60764784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com