如果表已存在,使用CREATE TABLE IF NOT EXISTS会失败

18

我有以下代码:

$db_host = 'localhost';
$db_port = '3306';
$db_username = 'root';
$db_password = 'root';
$db_primaryDatabase = 'dsl_ams';

// Connect to the database, using the predefined database variables in /assets/repository/mysql.php
$dbConnection = new mysqli($db_host, $db_username, $db_password, $db_primaryDatabase);

// If there are errors (if the no# of errors is > 1), print out the error and cancel loading the page via exit();
if (mysqli_connect_errno()) {
    printf("Could not connect to MySQL databse: %s\n", mysqli_connect_error());
    exit();
}

$queryCreateUsersTable = "CREATE TABLE IF NOT EXISTS `USERS` (
    `ID` int(11) unsigned NOT NULL auto_increment,
    `EMAIL` varchar(255) NOT NULL default '',
    `PASSWORD` varchar(255) NOT NULL default '',
    `PERMISSION_LEVEL` tinyint(1) unsigned NOT NULL default '1',
    `APPLICATION_COMPLETED` boolean NOT NULL default '0',
    `APPLICATION_IN_PROGRESS` boolean NOT NULL default '0',
    PRIMARY KEY  (`ID`)
)";

if(!$dbConnection->query($queryCreateUsersTable)){
    echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error;
}

哪些输出会导致神经网络学习?

Table creation failed: (1050) Table '`dsl_ams`.`USERS`' already exists

我不明白的是:如果表已经存在,IF NOT EXISTS 不应该取消 SQL 查询的执行吗?换句话说,如果表存在,它不应该退出该 if 语句并且不输出任何内容,也不应尝试执行查询吗?

只是想找到最好的方法来“创建一个不存在的表”,而不向用户输出任何内容。


"$queryCreateUsersTable!=$queryCreateTable",我会启用通知来查看这种错误。 - Wrikken
“启用通知”?你的意思是什么?是的,我完全犯傻了。 - Samuel Stiles
1
将 error_reporting 设置为正确的级别(在开发过程中我会使用 error_reporting(E_ALL | E_STRICT);),并在您的开发环境上使用 ini_set('display_errors',1);,在生产环境上使用 ini_set('log_errors',1);(无需向最终用户显示错误)。 - Wrikken
我更新了我的问题,修复了之前的问题,但又遇到了一个新问题。 - Samuel Stiles
1
似乎在Windows机器上存在问题:http://ledyardconsulting.blogspot.co.at/2011/03/mysql-error-1050-table-already-exists.html - Philipp
显示剩余2条评论
5个回答

26

试一下这个

$query = "SELECT ID FROM USERS";
$result = mysqli_query($dbConnection, $query);

if(empty($result)) {
                $query = "CREATE TABLE USERS (
                          ID int(11) AUTO_INCREMENT,
                          EMAIL varchar(255) NOT NULL,
                          PASSWORD varchar(255) NOT NULL,
                          PERMISSION_LEVEL int,
                          APPLICATION_COMPLETED int,
                          APPLICATION_IN_PROGRESS int,
                          PRIMARY KEY  (ID)
                          )";
                $result = mysqli_query($dbConnection, $query);
}

这段代码用于检查表中是否有数据,如果返回NULL,则表示该表为空。

此外,MySQL 中没有BOOLEAN 数据类型,您应该使用INT 并在插入表时将其设置为 1 或 0。您也不需要在所有内容周围加单引号,只需在将数据硬编码到查询中时加上。

像这样...

$query = "INSERT INTO USERS (EMAIL, PASSWORD, PERMISSION_LEVEL, APPLICATION_COMPLETED, APPLICATION_IN_PROGRESS) VALUES ('foobar@foobar.com', 'fjsdfbsjkbgs', 0, 0, 0)";

1
我会使用 SHOW TABLES LIKE 'USERS'。请注意,这是区分大小写的。 - But those new buttons though..
6
我虽然不是专业的MySQL专家,但如果表已经存在但是为空,那么这个操作会失败,对吗? - Frank Schmitt
@FrankSchmitt 我也这么认为。 - GeneCode

4
为避免输出任何内容,在尝试创建表之前,请先在您的php中测试该表。例如,
$querycheck='SELECT 1 FROM `USERS`';

$query_result=$dbConnection->query($querycheck);

if ($query_result !== FALSE)
{
 // table exists
} else
{
// table does not exist, create here.
}

2
如果表已经创建但是还没有记录,怎么办? - Andres Ramos

2

这篇旧文章展示了糟糕的实践和不一致的答案。遗憾的是,将其视为重复内容并关闭它并不能使其从公众视野中消失,它仍将继续传播错误信息。

以下是简短的事实检查:

  • 如果您的系统正常,则CREATE TABLE IF NOT EXISTS应该可以正常工作。
  • 如果出现幽灵表,请参考此帖子进行修复。
  • 检查表是否存在时,永远不要从表中选择任何内容,否则会导致错误
    • (然而,与许多评论中表达的错误观念相反,空表不会返回空结果。空结果意味着错误。要检查查询是否返回任何行,您必须获取它们)
  • 相反,运行SHOW TABLES LIKE 'Users'查询,获取行到一个变量中,然后查看它是否为空。

-1

这个程序将连接到mysql,检查数据库是否存在。如果存在,则会检查表是否存在。如果两者都不存在,则会自动创建它们。

$servername = "hostname";
    $username = "username";
    $password = "password";
    $dbname = "database_name";
    // Create connection
    $conn = new mysqli($servername, $username, $password);
    // Check connection
    if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
    }

// Create database
$sql = "CREATE DATABASE IF NOT EXISTS database_name";
if ($conn->query($sql) === TRUE) {
  $conn = new mysqli($servername, $username, $password, $dbname);
  // Check connection
  if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
  }
  $sql1 = "CREATE TABLE IF NOT EXISTS Users (ID int(11) AUTO_INCREMENT,
                      EMAIL varchar(255) NOT NULL,
                      PASSWORD varchar(255) NOT NULL,
                      PERMISSION_LEVEL int,
                      APPLICATION_COMPLETED int,
                      APPLICATION_IN_PROGRESS int,
                      PRIMARY KEY  (ID))";
  if($conn->query($sql1) === TRUE) {
    echo "Database and Table Online";
  }else{
    echo "Database and Table Offline" . $conn->error;
  }
} else {
  echo "Error creating database: " . $conn->error;
}

$conn->close();

1
这段代码不是与问题中的代码相同吗? - Your Common Sense
只返回 SQL 查询以匹配他的需求。 - Michal Tymburski
但是这个问题对他没有起作用。那就是问题。 - Your Common Sense
他正在使用PHP过程式编程,而且可能在其他文件中,他将其与面向对象编程混合使用。也许这就是问题所在,而不是代码本身的问题。 - Michal Tymburski
不,从技术上讲,你可以自由地混合风格,尽管这当然是一种不好的风格。 - Your Common Sense

-2

如果错误编号不是1050,那么只显示错误信息如何?

if(!$dbConnection->query($queryCreateUsersTable)){
  if($dbConnection->errno != 1050){
    echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接