这似乎是一个简单的问题,但经过一段时间的搜索后,我找不出答案。
我目前在本地数据库中有一个由webapp使用的MySQL表,它们在远程服务器的数据库中也有相同的表。现在,我通过PHP使用CREATE TABLE IF NOT EXISTS命令在数据库上创建表:
CREATE TABLE IF NOT EXISTS users (
`id` int(10) NOT NULL AUTO_INCREMENT,
`username` varchar(18) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;但是,假设我对本地数据库进行了修改,例如添加了一列。每次我更改本地数据库时,都要去更改远程数据库,这真的很烦人。如果表不存在,有没有更简单的方法来运行代码来创建表,如果它确实存在,请确保它的结构与create table结构的结构匹配?
这里有一个例子,让我想要表达的更清楚一些。假设我在本地数据库上有一个users表,并且我决定在我的Let应用程序中有另一个列password。因此,我转到本地数据库并添加了一个password列。有没有我可以运行的PHP/MySQL代码来检查users表是否存在,如果存在,确保它有一个password列,如果没有,就添加它?
发布于 2010-11-04 23:16:05
要直接回答您的问题,您可以创建临时过程来检测字段是否存在,就像这样使用查询:
SHOW COLUMNS FROM table_name LIKE 'column_name';
然而,在现实世界中,数据库更改通常包含在三个脚本中。一个创建脚本和两个增量,一个向上,一个向下。然后对数据库进行版本化,这样您就可以知道数据库在任何给定时间处于什么状态。
发布于 2010-11-04 23:16:30
您实际上正在寻找的是迁移,例如,您正在寻找一个模式管理工具,该工具可以让您在版本控制代码差异中管理您的数据库结构。
例如,对于您描述的场景,您将首先创建一个脚本来创建表,例如001_create_user_table.sql。然后,您将使用模式管理器将这些更改连接并部署到数据库。
当您想要更改或添加某些内容时,只需编写另一个脚本,例如002_Add_Password_Column_To_User_Table.sql。只需填写代码即可完成此更改。然后再次运行模式管理器。
通常,您告诉Schema Manager遍历所有现有的迁移文件。在每次运行时,Schema管理器将更新数据库中的changelog表,因此当您运行它时,它将知道它应该应用哪些脚本。
好处是,您可以将这些迁移添加到常规的VCS中,这样您就可以始终知道在应用程序的哪个版本上使用哪个数据库模式。您将为它们创建一个适当的changelog。
发布于 2010-11-04 23:14:18
要专门检查password列,可以使用DESCRIBE
$colExists = false;
$res = mysql_query('DESCRIBE `users`');
while ($row = mysql_fetch_assoc($res)) {
if ($row['Field'] == 'password') {
$colExists = true;
break;
}
}
if (!$colExists) {
// create column
}但是,您应该查看replication或其他一些自动化工具,看看它们是否对您来说是更好的解决方案。
https://stackoverflow.com/questions/4097868
复制相似问题