【发布时间】:2019-10-08 03:12:22
【问题描述】:
到目前为止,它只创建了前 3 个表:employee、skill、client
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 作为答案,我很乐意投票并接受。干杯!