代码之家  ›  专栏  ›  技术社区  ›  element119

创建表Else Alter Table

  •  4
  • element119  · 技术社区  · 15 年前

    这似乎是一个简单的问题,但经过一段时间的搜索,我无法找到答案。

    CREATE TABLE IF NOT EXISTS 通过PHP命令在数据库上创建表:

    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 ;
    

    这里有一个例子,让我想表达的东西更清楚一点。假设在本地数据库中,我有一个users表,我决定在我的webapp中,我想要另一个collumn, password . 所以我去本地数据库添加一个 密码 密码 勾结,如果不是,加上它?

    4 回复  |  直到 13 年前
        1
  •  1
  •   Harmon Wood    15 年前

    为了直接回答你的问题,你可以创建一个临时的程序来检测字段的存在,比如使用这样的查询:

    SHOW COLUMNS FROM table_name LIKE 'column_name';

    然而,在现实世界中,数据库更改通常会被转换成三个脚本。一个创建脚本和两个delta一个向上一个向下。然后对数据库进行版本控制,以便您知道数据库在任何给定时间处于什么状态。

        2
  •  2
  •   Gordon Haim Evgi    12 年前

    例如,对于所描述的场景,首先创建一个脚本来创建表,例如。 001_create_user_table.sql

    当你想改变或添加一些东西时,你只需编写另一个脚本,例如, 002_Add_Password_Column_To_User_Table.sql

    通常,您可以告诉架构管理器通过所有现有的迁移文件。每次运行时,模式管理器都会更新数据库中的变更日志表,因此当您运行它时,它会知道应该应用哪个脚本。

    好的是,您可以将这些迁移添加到常规VCS中,这样您就可以始终知道在应用程序的哪个版本上使用了哪个数据库模式。你会有一个合适的变更日志给他们。

        3
  •  0
  •   webbiedave    15 年前

    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

        4
  •  0
  •   Lajos Arpad    15 年前

    遵循以下步骤(可以在PHP中轻松实现,我假设表的名称是Foo)

    1.)运行以下代码:

    desc Foo
    

    2.)根据第一步的结果,您可以使用create table命令(您应该这样做)

    3)将您的数据从现有表中存储,这些表将被替换为变量(可选的,如果您可以使用旧表中的数据,则只需要此数据)

    5)从新的Foo表中获取行

    6.)合并步骤4中得到的结果。)和5.)(可选,仅当可能使用旧表中的数据时才需要此选项)

    8.)生成一个replace-into命令,将所有行插入到新创建的Foo表中(您可以阅读更多关于此的信息 here

    在这些步骤之后,您将得到新版本的表。如果表太大,可以执行“如果不存在,则创建表”命令,如果创建不成功,请运行alter命令。

    编辑: here ) 可以使用以下函数运行查询:mysql query(文档 here )

    $field_list = "1";
    foreach ($bar as $key => $value)
        $field_list.= ",".$bar[$key];
    
    mysql_connect(/*connection data*/);
    mysql_query("select ".$field_list." from Foo");
    

    您可以使用新资源建立一个insert命令,以便在重新创建删除后插入所有重要数据(关于资源,请阅读更多信息 here here 但是,我建议您应该使用替换来代替插入,它像插入一样工作,除了它已经替换了行,如果它已经存在,它比插入更好。 在这里 )

    推荐文章