我有一个带有表(邮件)的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!
答案 0 :(得分:2)
尝试更改不存在的表将引发错误。这就足够了:
$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
我不能不提这个代码闻起来很糟糕。唯一不推荐对您的逻辑进行严格修改的情况是,这只与自动安装/升级过程有关。
答案 1 :(得分:0)
对此有一种不正常的黑客行为,效果很好
CREATE TABLE IF NOT EXISTS ...
内容ALTER TABLE ...
内容忽略导致错误file_put_contents(__FILE__,'');
首次运行时,它将执行必须执行的操作,在以后的运行中,您将包含一个空文件。即使是并发的第一次运行也没有问题,因为IF NOT EXISTS
的结果只有一次是真的,而ALTER TABLE
只会失败。
这提供了一个丑陋但工作路径,从无表或错误的表版本到所需的版本。