FOREIGN KEY SQL неверный синтаксис в PHP скрипте - PullRequest
0 голосов
/ 06 февраля 2020

Я использую сценарий php для создания таблиц в базе данных. Таблицы с 1 по 3 работают отлично, но я получаю эту ошибку для остальных:

Ошибка добавления таблицы 4: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с «позиция (регион), КЛЮЧ ВНЕШНИЙ (болезнь) ЛИТЕРАТУРА болезнь (name_ill))» в строке 9 Ошибка добавления таблицы 5: у вас есть ошибка в ваш SQL синтаксис; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с «позиция (регион), КЛЮЧЕВОЙ КЛЮЧ (болезнь) ЛИТЕРАТУРА болезнь (name_ill))» в строке 9 Ошибка добавления таблицы 6: у вас есть ошибка в ваш SQL синтаксис; обратитесь к руководству, соответствующему вашей MySQL версии сервера, чтобы найти правильный синтаксис для использования рядом со значением «позиция (регион), КЛЮЧЕВОЙ КЛЮЧ (болезнь) ЛИТЕРАТУРА болезнь (name_ill))» в строке 10 Ошибка добавления таблицы 7: у вас есть ошибка в ваш SQL синтаксис; обратитесь к руководству, соответствующему вашей MySQL версии сервера, для правильного синтаксиса для использования рядом с 'позиция (регион), ЗАРУБЕЖНЫЙ КЛЮЧ (болезнь) ССЫЛКИ болезнь (name_ill))' в строке 12

I прикрепите код для таблиц, так как я не могу найти ошибку SQL. Вроде бы проблема с синтаксисом внешнего ключа, но выглядит он отлично. Я попытался добавить и удалить скобки, изменить порядок внешних ключей и добавить точку с запятой после оператора, но ничего не получалось.

$table1 = "CREATE TABLE user (
    id INT NOT NULL AUTO_INCREMENT,
    email VARCHAR(255) NOT NULL UNIQUE,
    username VARCHAR(255) NOT NULL UNIQUE,
    passwd VARCHAR(255) NOT NULL,
    age DATE DEFAULT NULL,
    moderator BOOLEAN DEFAULT 0,
    PRIMARY KEY (id)
)";

$table2 = "CREATE TABLE position (
    region VARCHAR(255) NOT NULL UNIQUE,
    x_coordinate FLOAT(24) NOT NULL,
    y_coordinate FLOAT(24) NOT NULL,
    PRIMARY KEY (region)
)";

$table3 = "CREATE TABLE illness (
    name_ill VARCHAR(255) NOT NULL,
    PRIMARY KEY (name_ill)
)";

$table4 = "CREATE TABLE user_vaccine (
    id INT NOT NULL AUTO_INCREMENT,
    time_vacc DATE NOT NULL,
    illness VARCHAR(255) NOT NULL,
    region VARCHAR(255) NOT NULL,
    usr_id INT NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (usr_id) REFERENCES user(id),
    FOREIGN KEY (region) REFERENCES position(region),
    FOREIGN KEY (illness) REFERENCES illness(name_ill)
)";

$table5 = "CREATE TABLE user_illness (
    id INT NOT NULL AUTO_INCREMENT,
    time_ill DATE NOT NULL, 
    illness VARCHAR(255) NOT NULL, 
    region VARCHAR(255) NOT NULL, 
    usr_id INT NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (usr_id) REFERENCES user(id), 
    FOREIGN KEY (region) REFERENCES position(region),
    FOREIGN KEY (illness) REFERENCES illness(name_ill)
)";

$table6 = "CREATE TABLE official_illness (
    id INT NOT NULL AUTO_INCREMENT, 
    time_ill DATE NOT NULL, 
    illness VARCHAR(255) NOT NULL, 
    web_url VARCHAR(255) NOT NULL, 
    region VARCHAR(255) NOT NULL, 
    usr_id INT NOT NULL, 
    PRIMARY KEY (id),
    FOREIGN KEY (usr_id) REFERENCES user(id),
    FOREIGN KEY (region) REFERENCES position(region),
    FOREIGN KEY (illness) REFERENCES illness(name_ill)
)";

$table7 = "CREATE TABLE official_vaccine (
    id INT NOT NULL AUTO_INCREMENT, 
    year_vacc SMALLINT NOT NULL, 
    perc_vacc FLOAT(4,2) NOT NULL, 
    region VARCHAR(255) NOT NULL, 
    age_group INT, 
    report_organisation VARCHAR(255), 
    usr_id INT NOT NULL, 
    illness VARCHAR(255) NOT NULL, 
    PRIMARY KEY (id),
    FOREIGN KEY (usr_id) REFERENCES user(id),
    FOREIGN KEY (region) REFERENCES position(region),
    FOREIGN KEY (illness) REFERENCES illness(name_ill)
)";

1 Ответ

3 голосов
/ 06 февраля 2020

В mysql есть строковая функция с именем position () , поэтому часть кода position(region) интерпретируется как вызов функции из-за (region). Это приводит к синтаксической ошибке.

Решение состоит в том, чтобы использовать обратные галочки, чтобы указать, что местоположение и регион являются именами таблиц и полей:

`position`(`region`)

Вы должны изменять эту часть кода в каждом таблица.

...