奇怪的 MySQL CREATE TABLE 行为
Posted
技术标签:
【中文标题】奇怪的 MySQL CREATE TABLE 行为【英文标题】:Strange MySQL CREATE TABLE behavior 【发布时间】:2013-10-06 09:26:46 【问题描述】:我已经在这个问题上卡了大约一个小时,但我无法解决它。请帮忙!
这是我的查询:
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】:是指你的报错信息,但一般都是外键导致的这种报错! 外键列和引用之间可能存在差异。 例如,您的参考列类型可能与您的外键不同!
【讨论】:
【参考方案2】:尝试删除外键,稍后使用 ALTER TABLE 添加它们。
【讨论】:
谢谢,但还是不行。正如我所说,查询在命令行和 phpmyadmin 中按原样工作。 不幸的是,仍然一无所获。 :( mysql 版本有什么不同吗?如果该表存在,还要检查 UBUNTU。 其实有...以前我用的是5.5.24,现在是5.5.32。我也想过这个问题,但我认为这与它无关,因为它可以在命令行和 phpmyadmin 中运行。【参考方案3】:哈...原来我在 IDE 工作区中所做的更改并没有反映在我的 /www/ 目录中(可能是 Linux 新手错误)。代码第一次没有正确运行,因为这个较新版本的 MySQL 显然不允许 DATETIME
列具有函数返回的默认值。不过,TIMESTAMP
s 仍然可以有默认值 NOW()
。无论如何,谢谢大家。
【讨论】:
以上是关于奇怪的 MySQL CREATE TABLE 行为的主要内容,如果未能解决你的问题,请参考以下文章
ActiveRecord::Migration 的 create_join_table 的行为是啥?
关于 CREATE TABLE ... CLONE COPY GRANTS 行为的问题