【问题标题】:MySQL: Fails to create table with Foreign KeyMySQL:无法使用外键创建表
【发布时间】:2019-10-08 03:12:22
【问题描述】:

到目前为止,它只创建了前 3 个表:employeeskillclient

CREATE SCHEMA IF NOT EXISTS my_db;

USE my_db;

CREATE TABLE IF NOT EXISTS employee(
    id INT UNSIGNED AUTO_INCREMENT,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    position VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL,
    PRIMARY KEY(id)
)ENGINE=INNODB;

CREATE TABLE IF NOT EXISTS skill(
    code VARCHAR(255),
    description VARCHAR(255),
    PRIMARY KEY(code)
)ENGINE=INNODB;

CREATE TABLE IF NOT EXISTS client(
    code VARCHAR(255),
    description VARCHAR(255),
    PRIMARY KEY(code)
)ENGINE=INNODB;

CREATE TABLE IF NOT EXISTS project(
    code VARCHAR(255),
    role VARCHAR(255) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE NOT NULL,
    description VARCHAR(255),
    client.code VARCHAR(255),
    PRIMARY KEY(code),
    FOREIGN KEY(client.code) REFERENCES client(code),
    ON DELETE CASCADE
    ON UPDATE CASCADE
)ENGINE=INNODB;

CREATE TABLE IF NOT EXISTS responsibility(
    id INT UNSIGNED AUTO_INCREMENT,
    description VARCHAR(255) NOT NULL,
    project.code VARCHAR(255),
    PRIMARY KEY(id),
    FOREIGN KEY(project.code) REFERENCES project(code),
    ON DELETE CASCADE
    ON UPDATE CASCADE
)ENGINE=INNODB;

/* Junction Table */
CREATE TABLE IF NOT EXISTS employee_skill(
    employee.id VARCHAR(255),
    skill.code VARCHAR(255),
    PRIMARY KEY(employee.id, skill.code),
    FOREIGN KEY(employee.id) REFERENCES employee(id),
    FOREIGN KEY(skill.code) REFERENCES skill(code)
    ON DELETE CASCADE
    ON UPDATE CASCADE
)ENGINE=INNODB;

/* Junction Table */
CREATE TABLE IF NOT EXISTS employee_client(
    employee.id VARCHAR(255),
    client.code VARCHAR(255),
    PRIMARY KEY(employee.id, client.code),
    FOREIGN KEY(employee.id) REFERENCES employee(id),
    FOREIGN KEY(client.code) REFERENCES client(code)
    ON DELETE CASCADE
    ON UPDATE CASCADE
)ENGINE=INNODB;

当它使用project的外键命中第一个表时停止

然后抛出这个错误:

#1103 - Incorrect table name 'client'

【问题讨论】:

  • 不要在列名中加上点,那只是自找麻烦。如果您必须,请用反引号引用它们,例如`client.code`,但我更倾向于使用下划线,例如client_code
  • echoing Phil.... client.code 作为未加引号的标识符(即列名)无效。如果我们在列名中包含点字符,那么列名必须正确转义。在 MySQL 中执行此操作的默认方法是将标识符括在反引号字符 每个 引用标识符的位置。 (如果 sql_mode 包含 ANSI_QUOTES,那么我们也可以使用 Oracle 样式的双引号字符。)再次呼应 Phil,除非有特定原因需要在列名中使用点字符,否则不要这样做。并使用下划线作为分隔符。
  • 谢谢大家,我解决了这个问题。如果有人可以将他们的 cmets 作为答案,我很乐意投票并接受。干杯!

标签: mysql sql


【解决方案1】:
CREATE TABLE IF NOT EXISTS project(
    code VARCHAR(255),
    role VARCHAR(255) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE NOT NULL,
    description VARCHAR(255),
    client_code VARCHAR(255),
    PRIMARY KEY(code),
    FOREIGN KEY(client_code) REFERENCES client(code)
    ON DELETE CASCADE
    ON UPDATE CASCADE
)ENGINE=INNODB;

删除逗号(,)并将您的client.更改为client_code 享受(',')

【讨论】:

  • 很好,没有人注意到逗号:D
【解决方案2】:

项目表中的列名client.code 导致中断,因为已经有一个名为client 的表。

您必须在反引号中使用列名,例如:

`client.code`

我建议改用下划线并将其设为client_code 以完全避免句号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2012-04-23
    相关资源
    最近更新 更多