0

我有一个带有表(邮件)的 MySQL 数据库,其中包含以下列:ID、内容、日期和标题。我想知道是否有一个选项可以检查表是否存在,如果存在则更改表,例如,如果我想添加一列。我为此找到的唯一可能的解决方案是这样的:

$sql=mysql_query(
        "SELECT something FROM Mail");

if (!$sql){

mysql_query("ALTER TABLE Mail ADD Test VARCHAR(150) DEFAULT NULL");

}ELSE{

mysql_query("CREATE TABLE if not exists `Mail` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Content` longtext,
`Datum` varchar(15) DEFAULT NULL,
`Titel` varchar(150) DEFAULT NULL,
`Test` varchar(150) DEFAULT NULL,

PRIMARY KEY (`ID`)
) ");

}

所以我想知道是否有更简单的方法可以做到这一点,甚至可能在 1 个查询中(可能没有)?如果有人知道更好/更简单的方法来做到这一点,那就太好了!

而且我知道 Mysql_ 已被弃用,但我很快就会切换到 PDO!

4

2 回答 2

2

尝试 ALTER 不存在的表将引发错误。这就足够了:

$res = mysql_query('ALTER TABLE Mail...');
if (!res) {
    mysql_query('CREATE TABLE Mail...');
}

或者你可以更加骇人听闻:

mysql_query('CREATE TABLE Mail IF NOT EXISTS...'); // does nothing if table already exists
mysql_query('ALTER TABLE Mail ADD Test...'); // does nothing if the column already exists

我不得不提到这段代码闻起来很糟糕。我不建议对您的逻辑进行严重返工的唯一情况是,这仅与自动安装/升级过程有关。

于 2013-06-07T09:37:14.700 回答
0

有一个丑陋的黑客,效果很好

  • 创建一个脚本,即
    • 做的CREATE TABLE IF NOT EXISTS ...东西
    • 这些ALTER TABLE ...东西是否忽略了由此产生的错误
    • 自杀file_put_contents(__FILE__,'');
  • 包括它

在第一次运行时,它将执行必须完成的操作,在以后的运行中,您将包含一个空文件。即使是并发的第一次运行也没有问题,因为IF NOT EXISTS条件只有一次,并且ALTER TABLE会失败。

这提供了从没有表或表的错误版本到所需版本的丑陋但有效的路径。

于 2013-06-07T09:36:46.370 回答