Внешний ключ PHP и MySQL работает не так, как ожидалось

#php #mysql #sql

#php #mysql #sql

Вопрос:

Я немного работаю с MySQL, используя команды только через PHP (без использования интерфейса phpMyAdmin для создания таблиц), и у меня возникла небольшая проблема с созданием первичного и внешнего ключей. Это мой текущий код.

 <?php
$conectar = mysql_connect("localhost", "root", "") or die (mysql_error());
//mysql_query("CREATE DATABASE DataBaseTeste") or die(mysql_error());
mysql_select_db("DataBaseTeste") or die(mysql_error());
mysql_query("CREATE TABLE Pergunta("
    . "id_Pergunta INT AUTO_INCREMENT,"
    . "Descricao TEXT,"
    . "Nivel VARCHAR,"
    . "PRIMARY KEY(id_Pergunta),"
    . "FOREIGN KEY(id_Assunto) REFERENCES Assunto(id_Assunto))")Or die(mysql_error());

mysql_query("CREATE TABLE Aluno("
    . "id_Aluno INT NOT NULL,"
    . "AlunoNome CHAR,"
    . "Grupo CHAR,"
    . "PRIMARY KEY(id_Aluno))")Or die(mysql_error());

mysql_query("CREATE TABLE Assunto("
    . "id_Assunto INT,"
    . "Descricao VARCHAR,"
    . "PRIMARY KEY(id_Assunto))")Or die(mysql_error());


mysql_close();

?>
  

Я также пытался использовать это (без внешнего КЛЮЧА, просто вставив идентификатор другой таблицы):

 $conectar = mysql_connect("localhost", "root", "") or die (mysql_error());
//mysql_query("CREATE DATABASE DataBaseTeste") or die(mysql_error());
mysql_select_db("DataBaseTeste") or die(mysql_error());
mysql_query("CREATE TABLE Pergunta("
    . "id_Pergunta INT AUTO_INCREMENT,"
    . "Descricao TEXT,"
    . "Nivel VARCHAR,"
    . "PRIMARY KEY(id_Pergunta),"
    . "id_Assunto INT)")Or die(mysql_error());
  

Сообщение об ошибке, которое я получаю, выглядит следующим образом:

«У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘PRIMARY KEY (id_Pergunta) …»

Вероятно, это что-то довольно глупое, но я не могу в этом разобраться.

Комментарии:

1. Замените функции mysql_ * на mysqli_*

2. ВСЕ функции? потому что я только что обновил все, и это не сработало…

Ответ №1:

Сначала попробуйте использовать имена в нижнем регистре, я просто сделал это для PKs

Затем, чтобы использовать foreign keys , вы должны добавить имя столбца в ту таблицу, которая будет содержать FK

Также тогда вам нужно использовать INNODB , не могу вспомнить, MyIsam позволяет ли вам FK, но я рекомендую это, обратите внимание, что INNODB для них тоже будет создан индекс.

 CREATE TABLE assunto(
    id_assunto INT,
    descricao VARCHAR(254),
    PRIMARY KEY(id_assunto)
)ENGINE=INNODB; 

CREATE TABLE aluno(
    id_aluno INT NOT NULL,
    alunoNome CHAR(254),
    grupo CHAR,
    PRIMARY KEY(id_aluno)
)ENGINE=INNODB;


CREATE TABLE pergunta(
    id_pergunta INT AUTO_INCREMENT,
    id_assunto int,
    descricao TEXT,
    nivel VARCHAR(254),
    PRIMARY KEY(id_pergunta),
    FOREIGN KEY(id_assunto) REFERENCES assunto(id_assunto)
)ENGINE=INNODB;
  

Позвольте мне добавить вам версию PHP, обратите внимание на порядок выполнения.

 <?php
$conectar = mysql_connect("localhost", "root", "") or die (mysql_error());
//mysql_query("CREATE DATABASE DataBaseTeste") or die(mysql_error());
mysql_select_db("DataBaseTeste") or die(mysql_error());

mysql_query("CREATE TABLE aluno("
    . "id_aluno INT NOT NULL,"
    . "alunoNome CHAR,"
    . "grupo CHAR,"
    . "PRIMARY KEY(id_aluno))")Or die(mysql_error());

mysql_query("CREATE TABLE assunto("
    . "id_assunto INT,"
    . "descricao VARCHAR,"
    . "PRIMARY KEY(id_assunto))")Or die(mysql_error());

    mysql_query("CREATE TABLE Pergunta("
    . "id_pergunta INT AUTO_INCREMENT,"
    . "id_assunto INT AUTO_INCREMENT,"
    . "descricao TEXT,"
    . "Nivel VARCHAR,"
    . "PRIMARY KEY(id_pergunta),"
    . "FOREIGN KEY(id_assunto) REFERENCES assunto(id_assunto))")Or die(mysql_error());

mysql_close();
  

Это рабочий sqlfiddle Mysql 5.1, я использую 5.5.32, но show as 5.1 тоже будет работать.
http://sqlfiddle.com /#!8/f88b5/3

Комментарии:

1. Я использовал точно такой же код, который вы создали здесь, и он создал базу данных и таблицу «Aluno», но все остальное не сработало, и теперь у меня появляется вот эта ошибка: у вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘PRIMARY KEY (id_assunto))’ в строке 1

2. Я обновил свой скрипт (не версию php) там, где есть несколько дополнительных символов (‘;’) , но я сделал это из mysql-cli, с MYSQL 5.5.32, попробуйте это из командной строки, это будет быстрее, чем транскрибировать на ваш PHP, copy paste должно сработать

3. Да, я не смог найти, что происходит, но вы очень помогли, по крайней мере, база данных создана и работает, большое спасибо, приятель.

4. Я добавил sqlfidle, чтобы вы могли поиграть с ним

5. большое спасибо, там все работает просто отлично, но по какой-то причине php-код просто не понимает команды первичного и внешнего ключей