DROP TABLE IF EXISTS Sold; DROP TABLE IF EXISTS Transactions; DROP TABLE IF EXISTS Passbys; DROP TABLE IF EXISTS Tickets; DROP TABLE IF EXISTS Seats; DROP TABLE IF EXISTS Users; DROP TABLE IF EXISTS Passengers; DROP TABLE IF EXISTS Rides; DROP TABLE IF EXISTS Trains; DROP TABLE IF EXISTS Stations; CREATE TABLE Passengers ( ID BIGINT PRIMARY KEY, `Name` VARCHAR ( 255 ) NOT NULL, Phone_number BIGINT UNIQUE NOT NULL, CHECK ( REGEXP_LIKE ( ID, '^\\d{18}$' ) ), CHECK ( REGEXP_LIKE ( Phone_number, '^\\d{11}$' ) ) ); CREATE TABLE Users ( ID INT AUTO_INCREMENT PRIMARY KEY, `Password` VARCHAR ( 255 ) NOT NULL, Phone_number BIGINT UNIQUE NOT NULL, CitizenID BIGINT UNIQUE NOT NULL, FOREIGN KEY ( Phone_number ) REFERENCES Passengers ( Phone_number ) ON DELETE CASCADE, FOREIGN KEY ( CitizenID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE ); CREATE TABLE Stations ( ID INT AUTO_INCREMENT PRIMARY KEY, `Name` VARCHAR ( 255 ) UNIQUE NOT NULL, Province VARCHAR ( 255 ) NOT NULL, City VARCHAR ( 255 ) NOT NULL ); CREATE TABLE Trains ( ID VARCHAR ( 255 ) PRIMARY KEY, TrainName VARCHAR ( 255 ) NOT NULL, StationID_start INT NOT NULL, StationID_arrive INT NOT NULL, FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE ); CREATE TABLE Seats ( ID VARCHAR ( 255 ) PRIMARY KEY, Type VARCHAR ( 255 ) NOT NULL, TrainID VARCHAR ( 255 ) NOT NULL, FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE ); CREATE TABLE Tickets ( ID INT AUTO_INCREMENT PRIMARY KEY, Price DECIMAL ( 7, 2 ) NOT NULL, Time_start DATETIME NOT NULL, Time_arrive DATETIME NOT NULL, StationID_start INT NOT NULL, StationID_arrive INT NOT NULL, SeatID VARCHAR ( 255 ) NOT NULL, FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE, FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE, CHECK ( Time_start <= Time_arrive ) ); CREATE TABLE Transactions ( ID BIGINT AUTO_INCREMENT PRIMARY KEY, `Time` DATETIME NOT NULL, Paid TINYINT NOT NULL, `User` INT NOT NULL, PassengerID BIGINT NOT NULL, TrainID VARCHAR ( 255 ) NOT NULL, StationID_start INT NOT NULL, StationID_arrive INT NOT NULL, Time_start DATETIME NOT NULL, Time_arrive DATETIME NOT NULL, SeatID VARCHAR ( 255 ) NOT NULL, FOREIGN KEY ( `User` ) REFERENCES Users ( ID ) ON DELETE CASCADE, FOREIGN KEY ( PassengerID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE, FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE, FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE, FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE, CHECK ( Time_start < Time_arrive ) ); CREATE TABLE Sold ( TransactionID BIGINT NOT NULL, TicketID INT NOT NULL, FOREIGN KEY ( TransactionID ) REFERENCES Transactions ( ID ) ON DELETE CASCADE, FOREIGN KEY ( TicketID ) REFERENCES Tickets ( ID ) ON DELETE CASCADE ); CREATE TABLE Passbys ( StationID INT NOT NULL, TrainID VARCHAR ( 255 ) NOT NULL, arrive_time DATETIME NOT NULL, leave_time DATETIME NOT NULL, FOREIGN KEY ( StationID ) REFERENCES Stations ( ID ) ON DELETE CASCADE, FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE, CHECK ( arrive_time <= leave_time ) );