奇怪的 MySQL CREATE TABLE 行为

分享于2023年05月01日 mysql php sql 问答
【问题标题】:Strange MySQL CREATE TABLE behavior奇怪的 MySQL CREATE TABLE 行为
【发布时间】:2023-04-30 17:38:01
【问题描述】:

我已经在这个问题上卡了大约一个小时,但我无法解决它。请帮忙!

这是我的查询:

CREATE TABLE IF NOT EXISTS snippets (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    description TEXT NOT NULL,
    code TEXT NOT NULL,
    lang_id INT(3) UNSIGNED NOT NULL,
    dev_id INT(11) UNSIGNED NOT NULL,
    post_date TIMESTAMP NOT NULL DEFAULT NOW(),
    views INT UNSIGNED NOT NULL DEFAULT 0,
    FOREIGN KEY (lang_id) REFERENCES languages (id),
    FOREIGN KEY (dev_id) REFERENCES developers (id),
    PRIMARY KEY (id)
);

这个查询怎么可能在 PHPMyAdmin 和命令行中工作,而不是在 PHP 脚本中?这是应该创建的 6 个表中的第 3 个。前两个工作完美,但之后就没有了。任何帮助将不胜感激。

$link = new PDOConfig();

$link->query("CREATE DATABASE IF NOT EXISTS ratemycode");

$link->connect($link, 'ratemycode');

$queries['tables'] = array(
    "CREATE TABLE IF NOT EXISTS developers (
        id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        username VARCHAR(42) NOT NULL,
        password VARCHAR(64) NOT NULL,
        email VARCHAR(255) NOT NULL,
        PRIMARY KEY (id)
    )",
    "CREATE TABLE IF NOT EXISTS languages (
        id INT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
        name VARCHAR(42) NOT NULL,
        PRIMARY KEY (id)
    )",
    "CREATE TABLE IF NOT EXISTS snippets (
        id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        title VARCHAR(255) NOT NULL,
        description TEXT NOT NULL,
        code TEXT NOT NULL,
        lang_id INT(3) UNSIGNED NOT NULL,
        dev_id INT(11) UNSIGNED NOT NULL,
        post_date TIMESTAMP NOT NULL DEFAULT NOW(),
        views INT UNSIGNED NOT NULL DEFAULT 0,
        FOREIGN KEY (lang_id) REFERENCES languages (id),
        FOREIGN KEY (dev_id) REFERENCES developers (id),
        PRIMARY KEY (id)
    )",
    "CREATE TABLE IF NOT EXISTS comments (
        id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        body TEXT NOT NULL,
        post_date TIMESTAMP NOT NULL DEFAULT NOW(),
        snip_id INT(11) UNSIGNED NOT NULL,
        dev_id INT(11) UNSIGNED NOT NULL,
        FOREIGN KEY (snip_id) REFERENCES snippets (id),
        FOREIGN KEY (dev_id) REFERENCES developers (id),
        PRIMARY KEY (id)
     )",
    "CREATE TABLE IF NOT EXISTS upvotes (
        id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        snip_id INT(11) UNSIGNED NOT NULL,
        dev_id INT(11) UNSIGNED NOT NULL,
        FOREIGN KEY (snip_id) REFERENCES snippets (id),
        FOREIGN KEY (dev_id) REFERENCES developers (id),
        PRIMARY KEY (id)
    )",
    "CREATE TABLE IF NOT EXISTS downvotes (
        id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        snip_id INT(11) UNSIGNED NOT NULL,
        dev_id INT(11) UNSIGNED NOT NULL,
        FOREIGN KEY (snip_id) REFERENCES snippets (id),
        FOREIGN KEY (dev_id) REFERENCES developers (id),
        PRIMARY KEY (id)
    )"
);
foreach ($queries['tables'] as $table) {
    $link->query($table);
}

  • 错误信息是什么?
  • 我没有得到。在 php 脚本中,我使用了 try/catch 块,但没有抛出 PDOException。另外,我应该提到,同样的事情在 Windows 上也有效,但在切换到 Ubuntu 后就停止了。
  • 那么在这段代码之前创建的两个表是什么?
  • 如果 CREATE 语句在命令行中有效,但在包裹在 PHP 脚本中时无效,我建议您先查看 PHP 脚本
  • @OTTA,同样的脚本在我的 Wamp 环境中完美运行。我想不出任何理由它不应该在 Ubuntu 中工作。

【解决方案1】:

是指你的报错信息,但一般都是外键导致的这种报错! 外键列和引用之间可能存在差异。 例如,您的参考列类型可能与您的外键不同!

【讨论】: