更新mysql表

时间:2010-11-17 13:05:19

标签: mysql

我有一个使用下面的mysql语句创建的表。

CREATE TABLE `jos_ttvideo` (
 `id` int(11) NOT NULL auto_increment,
 `video_id` int(11) NOT NULL DEFAULT 0,
 `thumbnail` varchar(255) NOT NULL DEFAULT "",
 `thumbnail_med` varchar(255) NOT NULL DEFAULT "",
 `thumbnail_lrg` varchar(255) NOT NULL DEFAULT "",
 `title` varchar(50) NOT NULL DEFAULT "",
 `author` varchar(50) NOT NULL DEFAULT "",
 `description` varchar(255) NOT NULL DEFAULT "",
 `full_description` text NOT NULL DEFAULT "",
 `c_date` DATETIME NOT NULL,
 `plays` int(11) NOT NULL DEFAULT 0,
 `likes` int(11) NOT NULL DEFAULT 0,
 `width` int(4) NOT NULL DEFAULT 600,
 `height` int(4) NOT NULL DEFAULT 300,
 `published` tinyint(1) NOT NULL DEFAULT 0,
 `checked_out` tinyint(1) NOT NULL DEFAULT 0,
 `catid` int(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY  (`id`)
);

现在我想创建一个mysql更新脚本,它将保留表中包含的所有数据并添加&更新某些列。所以一旦完成,表结构将如下所示:

CREATE TABLE IF NOT EXISTS `jos_ttvideo` (
 `id` int(11) NOT NULL auto_increment,
 `video_id` varchar(255) NOT NULL DEFAULT 0,
 `site` varchar(20) NOT NULL DEFAULT "",
 `thumbnail` varchar(255) NOT NULL DEFAULT "",
 `thumbnail_med` varchar(255) NOT NULL DEFAULT "",
 `thumbnail_lrg` varchar(255) NOT NULL DEFAULT "",
 `title` varchar(50) NOT NULL DEFAULT "",
 `author` varchar(50) NOT NULL DEFAULT "",
 `description` varchar(255) NOT NULL DEFAULT "",
 `full_description` text NOT NULL DEFAULT "",
 `c_date` DATETIME NOT NULL,
 `plays` int(11) NOT NULL DEFAULT 0,
 `likes` int(11) NOT NULL DEFAULT 0,
 `width` int(4) NOT NULL DEFAULT 600,
 `height` int(4) NOT NULL DEFAULT 300,
 `custom_dimensions` tinyint(1) NOT NULL DEFAULT 0,
 `published` tinyint(1) NOT NULL DEFAULT 0,
 `checked_out` tinyint(1) NOT NULL DEFAULT 0,
 `catid` int(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY  (`id`)
);

基本上我有两种方法可以考虑这样做:

  1. 使用第二个mysql脚本创建临时表,将原始表中的数据复制到临时表,删除原始表,将临时表重命名为原始表名
  2. 为每个列更改运行一个alter table语句并添加列。
  3. 最好的方法是什么?因为表结构只有一些变化,我认为选项2将是一个更容易的路径。但是,如果将来会有更多的变化,那么我认为选项1会更好。如果我选择选项1,将原始表数据复制到临时表需要什么mysql?

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

只要您拥有/可以创建ALTER TABLE,就根本不需要选项1,因为当您使用选项2时,这正是MySQL本身所做的。

答案 1 :(得分:1)

我有不同的想法,
取决于表中的记录数量。
如果有很多记录, 逐栏改变将非常慢,
mysql将更加努力地进行数据写入并同时更新索引

选项1更清晰,
使用新结构创建表B. 从表A中执行插入选择到表B,
之后交换名称

PS:最小表写锁