I have the following table that joins driver and truck tables in order to assign trucks to drivers. I need to constraint entries that belong to the same driver on the same day, and DO NOT include the same truck code.
CREATE TABLE Assignments(
ID_CxC CHAR(3) NOT NULL PRIMARY KEY,
truck_code char(3) NOT NULL REFERENCES Trucks(truck_code),
driver_code char(5) NOT NULL REFERENCES Drivers(driver_code),
[date] DATE NOT NULL
);
INSERT Assignments
VALUES(1,1,1,'06-11-2021');
INSERT Assignments
VALUES(2,2,2,'06-11-2021');
INSERT Assignments
VALUES(3,3,3,'06-11-2021');
INSERT Assignments
VALUES(4,4,4,'06-11-2021');
INSERT Assignments
VALUES(5,5,5,'06-11-2021');
INSERT Assignments
VALUES(6,6,6,'06-11-2021');
INSERT Assignments
VALUES(7,1,1,'06-11-2021');
INSERT Assignments
VALUES(8,2,2,'06-11-2021');
INSERT Assignments
VALUES(9,3,3,'06-11-2021');
INSERT Assignments
VALUES(10,4,4,'06-11-2021');
It was suggested to create a boolean function to pass along dateval, truckval and driverval, and returns the following.
Not Exists (Select id_CxC From Assignments
Where Date = Dateval and Driver=Driverval
And Truck<>Truckval)
I have tried creating a function returning a bit datatype, but I honestly lack knowledge on user created functions, how would I go about passing the parameters for the function?
Is there an easier approach to the whole situation?
You clearly have two different entities -- but they are related. You have something like an "assignment" where a driver has a truck for one or more days. Then you have something like a "trip" where a driver uses the truck (what you are currently calling an "assignment").
So, I would model this as:
CREATE TABLE assignments (
ID_CxC CHAR(3) PRIMARY KEY,
truck_code char(3) NOT NULL REFERENCES Trucks(truck_code),
driver_code char(5) NOT NULL REFERENCES Drivers(driver_code),
date DATE NOT NULL,
UNIQUE (driver_code, date)
);
Note that there is only one row per driver and per date. Voila! Only one truck.
CREATE TABLE trips (
ID_trip INT IDENTITY(1, 1) PRIMARY KEY,
AssignmentId CHAR(3) NOT NULL REFERENCES Assignments(ID_CxC)
);
You can then add as many trips for a driver that you like, but for a given driver, they all have the same truck.