【问题标题】:SQL Script Errors in phpMyAdamin - Foreign Key RestraintphpMyAdmin 中的 SQL 脚本错误 - 外键约束
【发布时间】:2016-08-09 06:52:33
【问题描述】:

我正在创建一个 SQL 脚本并将其导入 phpMyAdmin。代码如下:

DROP DATABASE IF EXISTS Carpool;
CREATE DATABASE Carpool;
USE Carpool;

CREATE TABLE IF NOT EXISTS users (
    username    varchar(100)    NOT NULL,
    firstname   varchar(100)    NOT NULL,
    lastname    varchar(100)    NOT NULL,
    age         int(10)         NOT NULL,
    email       varchar(100)    NOT NULL,
    gender      varchar(1)      NOT NULL,
    passhash    varchar(100)    NOT NULL,
    PRIMARY KEY(username)
);

CREATE TABLE IF NOT EXISTS cars (
    car_id      int(50)     NOT NULL AUTO_INCREMENT,
    cartype     varchar(50),
    neatness    varchar(50),
    color       varchar(50),
    seats       int(50),
PRIMARY KEY(car_id)
);

CREATE TABLE IF NOT EXISTS startinglocation (
    startinglocation_id int(100)        NOT NULL AUTO_INCREMENT,
    address             varchar(200)    NOT NULL,
    zipcode             varchar(50)     NOT NULL,
    city                varchar(50)     NOT NULL,
    state               varchar(50)     NOT NULL,
    longitude           float(10)       NOT NULL,
    latitude            float(10)       NOT NULL,
PRIMARY KEY(startinglocation_id)
);

CREATE TABLE IF NOT EXISTS endinglocation (
    endinglocation_id   int(100)        NOT NULL AUTO_INCREMENT,
    address             varchar(200)    NOT NULL,
    zipcode             varchar(50)     NOT NULL,
    city                varchar(50)     NOT NULL,
    state               varchar(50)     NOT NULL,
    longitude           float(10)       NOT NULL,
    latitude            float(10)       NOT NULL,
PRIMARY KEY(endinglocation_id)
);

CREATE TABLE IF NOT EXISTS carpool (

    car_id              int(50),
    carpool_id          int(50) NOT NULL AUTO_INCREMENT,
    datetime            varchar(50),
    duration            varchar(50),
    numberofpassengers  int(10),
    startingtime        varchar(50) NOT NULL,
    endingtime          varchar(50) NOT NULL,
    recurrencelevel     int(10),
    startinglocation_id int(100),
    endinglocation_id   int(100),
PRIMARY KEY(carpool_id),
FOREIGN KEY(car_id)
    REFERENCES cars(car_id)
    ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY(startinglocation_id)
    REFERENCES startinglocation(startinglocation_id)
    ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY(endinglocation_id)
    REFERENCES endinglocation(endinglocation_id)
    ON DELETE SET NULL ON UPDATE CASCADE
);

CREATE TABLE IF NOT EXISTS driver (
    username    varchar(50) NOT NULL,
    carpool_id  int(50)     NOT NULL,
FOREIGN KEY (username)
    REFERENCES users(username)
    ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY (carpool_id)
    REFERENCES carpool(carpool_id)
    ON DELETE SET NULL ON UPDATE CASCADE
);

CREATE TABLE IF NOT EXISTS passenger (
    username        varchar(50) NOT NULL,
    carpool_id      int(50)     NOT NULL,
FOREIGN KEY (username)
    REFERENCES users(username)
    ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY (carpool_id)
    REFERENCES carpool(carpool_id)
    ON DELETE SET NULL ON UPDATE CASCADE
);
    
GRANT SELECT, INSERT, UPDATE, DELETE
ON *
TO mgs_user
IDENTIFIED BY 'Password1';

我收到此错误报告:

错误 SQL查询:

CREATE TABLE IF NOT EXISTS carpool (

    car_id              int(50),
    carpool_id          int(50) NOT NULL AUTO_INCREMENT,
    datetime            varchar(50),
    duration            varchar(50),
    numberofpassengers  int(10),
    startingtime        varchar(50) NOT NULL,
    endingtime          varchar(50) NOT NULL,
    recurrencelevel     int(10),
    startinglocation_id int(100),
    endinglocation_id   int(100),
PRIMARY KEY(carpool_id),
FOREIGN KEY(car_id)
    REFERENCES cars(car_id)
    ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY(startinglocation_id)
    REFERENCES startinglocation(startinglocation_id)
    ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY(endinglocation_id)
    REFERENCES endinglocation(endinglocation_id)
    ON DELETE SET NULL ON UPDATE CASCADE
)

MySQL 说:文档

1005 - 无法创建表 carpool.driver (errno: 150 "外键约束格式不正确") (详情...)

我觉得我为外键正确引用了这些表,但我尝试了一些小改动都没有成功。

【问题讨论】:

  • 您不能引用尚未定义的表。所以改变建表的顺序。
  • 我编辑了上面的代码以表明这是我尝试过的一种方法。我确保所有外键都在创建被引用的表之后。它产生了同样的错误。
  • driver.username 和 users.username 的类型(长度)不同。为什么不使用 auto_incrementing user_id?
  • ON DELETE SET NULL 不能用于NOT NULL 列。

标签: mysql sql database-design xampp


【解决方案1】:

carpool 表引用了startinglocationendinglocation 表,因此需要在它们之后创建。

只需更改创建顺序,在脚本开头执行startinglocationendinglocation 表,它应该可以工作。

@Paul Spiegel 为您提供了问题第二部分的答案:driverpassenger 表引用了不同类型的 users.username

【讨论】:

  • 我编辑了上面的代码以表明这是我尝试过的一种方法。我确保所有外键都在创建被引用的表之后。它产生了同样的错误。
  • 知道了。 @Paul Spiegel,创建了 auto_incrementing user_id 并将类型更改为相同长度的 int。删除了 NOT NULL 列的 ON DELETE SET NULL。根据 Anthony Drogon 验证表格的正确顺序。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2015-04-03
  • 2023-03-08
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多