我需要运行一个安装程序,它也可以是更新程序。
安装程序需要能够最终获得 mysql 数据库的特定方案/结构,无论某些表是否存在、丢失了几列,或者因为其结构是最新的而不需要更改。
我怎样才能优雅地组合ALTER
and CREATE
?
我在想一定有类似“添加...如果...重复”的内容
假设我有表 A。在一个客户端中,该表具有一列 -A1,而另一个客户端具有相同的表,但具有 A1 列和 A2 列。
我希望我的 sql 命令使两个客户端的表 A 包含三列:A1、A2 和 A3。
同样,我的脚本是一个转储到 mysql 的 sql 文件。
我该怎么做?谢谢 :-)
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;
更多信息:
- MySQL参考手册:第 19 章 INFORMATION_SCHEMA 表 http://dev.mysql.com/doc/refman/5.0/en/information-schema.html
- MySQL参考手册:INFORMATION_SCHEMA TABLES 表 http://dev.mysql.com/doc/refman/5.0/en/tables-table.html
- MySQL参考手册:INFORMATION_SCHEMA COLUMNS 表 http://dev.mysql.com/doc/refman/5.0/en/columns-table.html
UPDATE:
另一种可能更简单的选择是删除现有表并使用新架构重新创建它。为此,您需要:
- 创建临时表,现有表的精确副本
- 使用旧表中的数据填充临时表
- 删除旧表
- 使用新架构创建新表
- 使用临时表中的信息填充新表
- 删除临时表。
所以,在 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;
实际上最后一步“删除临时表”,您可以跳过一段时间。为了以防万一,您可能希望对旧表进行某种备份,“以防万一”。
更多信息:
- MySQL参考手册:创建表语法 http://dev.mysql.com/doc/refman/5.1/en/create-table.html
- MySQL参考手册:插入语法 http://dev.mysql.com/doc/refman/5.1/en/insert.html
- MySQL参考手册:INSERT ... SELECT 语法 http://dev.mysql.com/doc/refman/5.1/en/insert-select.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)