如果存在则更改表或如果不存在则创建

Alo*_*n_T 20 mysql alter-table create-table

我需要运行一个安装程序,它也可以是更新程序.安装程序需要能够最终拥有mysql数据库的某个方案/结构,无论是否存在某些表,错过了几列,或者由于其结构是最新的而无需更改.

怎样才能让优雅的组合ALTERCREATE

我当时认为必须有"添加...如果...重复"之类的东西

假设我有表A.在一个客户端中,表有一列-A1,另一个客户端具有相同的表,但列A1和列A2.

我希望我的sql命令使两个客户端的表A保持三列:A1,A2和A3.

同样,我的脚本是一个sql文件,我转储到mysql.

我该怎么做?谢谢 :-)

Gre*_*egD 21

MySQL INFORMATION_SCHEMA数据库救援:

-- First check if the table exists
IF EXISTS(SELECT table_name 
            FROM INFORMATION_SCHEMA.TABLES
           WHERE table_schema = 'db_name'
             AND table_name LIKE 'wild')

-- If exists, retreive columns information from that table
THEN
   SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
     FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'tbl_name'
      AND table_schema = 'db_name';

   -- do some action, i.e. ALTER TABLE if some columns are missing 
   ALTER TABLE ...

-- Table does not exist, create a new table
ELSE
   CREATE TABLE ....

END IF;
Run Code Online (Sandbox Code Playgroud)

更多信息:

更新:

另一个可能更容易的选择是删除现有表并使用新模式重新创建它.为此,您需要:

  1. 创建临时表,即现有表的精确副本
  2. 使用旧表中的数据填充临时表
  3. 放下旧桌子
  4. 使用新架构创建新表
  5. 使用临时表中的信息填充新表
  6. 删除临时表.

所以,在SQL代码中:

CREATE TABLE old_table_copy LIKE old_table;

INSERT INTO old_table_copy
SELECT * FROM old_table;

DROP TABLE old_table;

CREATE TABLE new_table (...new values...);

INSERT INTO new_table ([... column names from old table ...])
SELECT [...column names from old table ...] 
FROM old_table_copy;

DROP TABLE old_table_copy;
Run Code Online (Sandbox Code Playgroud)

实际上最后一步,"删除临时表.",你可以跳过一段时间.为了以防万一,您可能希望对旧表进行某种备份,"只是在案例中".

更多信息:


We0*_*We0 3

如果您使用编码语言,请执行以下操作:

SHOW TABLES LIKE 'myTable'
Run Code Online (Sandbox Code Playgroud)

如果它返回一个值,则调用更改,否则调用创建