2014-12-04 120 views
4

我有一个外键元素难度创建与MySQL(PDO)的表,没有外键的表中创建罚款,但没有我得到这个消息:PDO创建表的外键

SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法错误;

我已经尝试过寻找解决方案并调整代码,但似乎不断遇到这个问题。有没有解决办法,还是我是一个疯子?

<?php 
$servername = "localhost"; 
$username = "root"; 
$password = NULL; 
$dbname = "testapplciants"; 

try { 
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
    // set the PDO error mode to exception 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 


    //sql to create the activity registered table 
    $sql = "CREATE TABLE Activity_Register (
    Activity_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    participant_id INT(6) FOREIGN KEY (participant_id) REFERENCES participants, 
    entry_number INT(2), 
    recorded_result INT(6), 
    entry_date TIMESTAMP 

    )"; 

    // use exec() because no results are returned 
    $conn->exec($sql); 
    echo "Table Activity Recorder created successfully"; 
    } 
catch(PDOException $e) 
    { 
    echo $sql . "<br>" . $e->getMessage(); 
    } 

$conn = null; 
?> 
+0

我可以问,你为什么要用PHP代码创建你的表?在您的项目中访问它之前,使用数据库查看器创建它是否更实际? – silkfire 2014-12-04 13:17:11

+0

@silkfire尽管在这种情况下我同意你的观点,但如果处理更复杂的应用程序可能会涉及到“创建临时表”;) – 2014-12-04 13:21:34

+0

@NiettheDarkAbsol绝对如此,对于临时表来说,它肯定是有意义的,但对于可重复使用的表格 - 出于开发者的观点 - 我会发现在GUI中设计和构建表格更容易:) – silkfire 2014-12-04 13:24:28

回答

2

PRIMARY KEY在列的定义为单独定义读取PRIMARY KEY (`column_name`)

FOREIGN KEY没有这样的速记简写。

`participant_id` INT(6), 
FOREIGN KEY (`participant_id`) REFERENCES `participants` (`id???`) 

请注意,您在引用表忽略了列名,你应该也有ON DELETEON UPDATE参数太多。

+0

谢谢Niet the Dark Absol,我试过了,现在又发现了另一个错误。我是一个新手开发人员,所以有耐心:-)这次的错误是:SQLSTATE [HY000]:一般错误:1215无法添加外键约束 – Gareth 2014-12-04 13:58:02

+0

嗨,也许这不可能是问题,但仍然提及,你要去的列添加为外键必须被索引。 – 2018-02-08 19:04:01