简体   繁体   中英

SQL create table query with foreign keys

Hello I'm trying to create some tables when a new user registers in my php site and I'm trying to execute the last query in the transaction and it gives me the following error: #1005 - Can't create table 'user_39.records' (errno: 150) Could someone please point out what I'm doing wrong? I'm not so familiar with foreign keys this is my first time using them. Thank you.

database tables:

private function createDriversTable($database) {
    $query = "CREATE TABLE IF NOT EXISTS $database.drivers (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `surname` varchar(255) NOT NULL,
      `car_type` varchar(255) NOT NULL,
      `circulation_num` varchar(255) NOT NULL,
      `special_card_num` varchar(255) NOT NULL,
      `special_card_num_exp` date NOT NULL,
      `drivers_license_num` varchar(255) NOT NULL,
      `drivers_license_exp` date NOT NULL,
      `id_num` varchar(255) NOT NULL,
      `vat` varchar(255) NOT NULL,
      `address` varchar(255) NOT NULL,
      `mobile` bigint(20) NOT NULL,
      `radiotaxi_code` bigint(20) NOT NULL,
      `languages` varchar(255) NOT NULL,
      `email` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Driver records' AUTO_INCREMENT=1";

    return $query;
}

private function createClientsTable($database) {
    $query = "CREATE TABLE IF NOT EXISTS $database.clients (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `address` varchar(255) NOT NULL,
      `region` varchar(255) NOT NULL,
      `vat` varchar(255) NOT NULL COMMENT 'AFM',
      `tax_office` varchar(255) NOT NULL COMMENT 'DOY',
      `phone` bigint(20) NOT NULL,
      `mobile` bigint(20) NOT NULL,
      `email` varchar(255) NOT NULL,
      `notes` text NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Client records' AUTO_INCREMENT=1"; 

    return $query;
}

private function createCarsTable($database) {
    $query = "CREATE TABLE IF NOT EXISTS $database.cars (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `oil_change` date NOT NULL,
      `oil_filter` date NOT NULL,
      `petrol_filter` date NOT NULL,
      `air_filter` date NOT NULL,
      `cabin_filter` date NOT NULL,
      `carbon_filter` date NOT NULL,
      `front_breaks` date NOT NULL,
      `rear_breaks` date NOT NULL,
      `front_disc_breaks` date NOT NULL,
      `rear_disc_breaks` date NOT NULL,
      `break_fluids` date NOT NULL,
      `gear_oil` date NOT NULL,
      `gear_controller` date NOT NULL,
      `gear_filter` date NOT NULL,
      `tires` date NOT NULL,
      `kteo` date NOT NULL,
      `freon` date NOT NULL,
      `freon_filter` date NOT NULL,
      `steering_fluids` date NOT NULL,
      `axle_oil` date NOT NULL,
      `notes` text NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Car records' AUTO_INCREMENT=1";

    return $query;
}

private function createRecordsTable($database) {
    $query = "CREATE TABLE IF NOT EXISTS $database.records (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `date` date NOT NULL,
      `time` time NOT NULL,
      `driver_id` bigint(20) NOT NULL,
      `client_id` bigint(20) NOT NULL,
      `car_id` bigint(20) NOT NULL,
      `room_num` int(11) NOT NULL,
      `departure` text NOT NULL,
      `course` text NOT NULL,
      `destination` text NOT NULL,
      `arrives_from` text NOT NULL,
      `arrival_info` text NOT NULL,
      `route_type` bigint(20) NOT NULL,
      `payment_method` int(11) NOT NULL,
      `total_cost` float NOT NULL,
      `expenses` float NOT NULL,
      `profit` float NOT NULL,
      `notes` text NOT NULL,
      PRIMARY KEY (`id`),
      FOREIGN KEY (`driver_id`) REFERENCES $database.drivers(`id`),
      FOREIGN KEY (`client_id`) REFERENCES $database.clients(`id`),
      FOREIGN KEY (`car_id`) REFERENCES $database.cars(`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";

    return $query;      
}

您在结果表中缺少driver_id和client_id的未签名类型

In order to be a FOREIGN KEY in another table, you must have an index created on the other table . And in order to be able to reference a specific row reliably, it should therefore be a UNIQUE index. Otherwise, if you have duplicate values, the referencing table won't be able to discern which row it references. Even though InnoDB will allow you to create the relationship on a non-unique index, it is likely not the behavior you are looking for

First of all, your table isn't normalized. Try a quick search for "Database normalization": it will greatly help you.

Also, as it stands, we can't answer your question because we're lacking some critical information: the related tables structures.

For now, take a look at these points:

  1. Is user_39.drivers( id ) of type BIGINT?
  2. Is user_39.clients( id ) of type BIGINT?
  3. Is user_39.cars( id ) of type BIGINT?

I guess that one of them isn't BIGINT, and the data type difference is preventing you from creating the foreign key

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM