PHP和MySQL外键不能按预期工作

时间:2014-07-07 13:09:07

标签: php mysql sql

我只是通过PHP使用命令来做一些MySQL(不使用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();

?>

我也试过使用它(没有FOREIGN KEY,只需插入另一个表的id):

$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());

我得到的错误信息是:

  

&#34;您的SQL语法出错了;检查与您的MySQL服务器版本相对应的手册,以便在#PRREARY KEY(id_Pergunta)附近使用正确的语法......&#34;

这可能是非常愚蠢的事情,但我无法弄清楚。

1 个答案:

答案 0 :(得分: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,但显示为5.1也会起作用。 http://sqlfiddle.com/#!8/f88b5/3