【问题标题】:Table does not exist error [closed]表不存在错误[关闭]
【发布时间】:2013-08-15 03:09:02
【问题描述】:
$sql = "CREATE TABLE IF NOT EXISTS questions_$username(".
        "question_id INT NOT NULL AUTO_INCREMENT, ".
        "question MEDIUMTEXT, ".
        "answer CHAR(1), ".
        "PRIMARY KEY (question_id))";
$retval = mysql_query($sql, $conn) or die(mysql_error());

$sql = "CREATE TABLE IF NOT EXISTS tests_$username(".
        "test_id INT NOT NULL AUTO_INCREMENT, ".
        "name VARCHAR(30) NOT NULL, ".
        "duration INT NOT NULL, ".
        "PRIMARY KEY (test_id))";
$retval = mysql_query($sql, $conn) or die(mysql_error());

$sql = "CREATE TABLE IF NOT EXISTS questions_tests_$username(".
        "test_id INT NOT NULL, ".
        "question_id INT NOT NULL, ".
        "FOREIGN KEY (test_id) REFERENCES tests_$username(test_id), ".
        "FOREIGN KEY (question_id) REFERENCES questions_$username(question_id), ".
        "PRIMARY KEY (test_id, question_id))".
$retval = mysql_query($sql, $conn) or die(mysql_error());

echo "debug";

前两个表创建成功,但第三个没有。它甚至没有给出任何错误。最后一行被执行。我的数据库中的表数量没有限制。

【问题讨论】:

  • Please please please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial.
  • 另外,请不要为系统中的每个用户创建新表。这是一种反模式,它会杀死您的应用程序、服务器、您自己、您的家人以及名称以“S”开头的每个人
  • 请删除所有代码,然后从 PDO 重新开始。
  • 所有表格之母...
  • "在较小的数据库上进行查询更快。为什么这是一个反模式?"您将元数据值作为表名放入 SQL 中的反模式。如果您需要有关它们的统计信息,更好的规范化表更容易查询。您需要为所有用户编写更多统计查询的方式... SQL ANTI PATTERN..

标签: php mysql sql create-table


【解决方案1】:

我认为你需要重新考虑你的一般模式。

您应该为每个用户创建一个新表!

您应该有测试、问题、test_questions、答案和用户等表格。

类似这样的:

tests:
   id, name, duration
questions:
   id, question
test_questions:
   id, test_id, question_id
users:
   id, name
answers:
   id, test_questions_id, user_id, answer

然后你知道哪个测试,哪个用户用一个查询轻松回答了哪个问题。

【讨论】:

  • 这不能回答我的问题,但我还是要删除该代码。
  • @BojanSerafimov 这怎么不能回答你的问题?
  • @BojanSerafimov 你在吸毒吗?
  • @BojanSerafimov 答案是——不要这样做,这是不正确的和反模式的,你将来会遇到问题,这是一种更好的方法来做你想做的事情。
  • @BojanSerafimov 你刚刚确认在接触任何严肃的代码之前你应该去学习基础知识。否则你就犯了反人类罪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2014-12-25
  • 2013-01-30
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多