MySQL-修改表
在本教程中,我们将学习如何在MySQL中更改表。
我们使用" ALTER TABLE table_name"命令来更改MySQL中的表。
在本教程中,我们将介绍一些我们将遇到的常用修改。
添加新列
在以下示例中,我们将"生日"列添加到在CREATE Table教程中创建的" employee"表中。
这就是我们的桌子现在的样子。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `score` INT(11) DEFAULT '0', `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
现在,我们将在"得分"列之后添加"生日"列。
ALTER TABLE `employee` ADD COLUMN `birthday` DATE DEFAULT NULL AFTER `score`;
现在我们的表将如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `score` INT(11) DEFAULT '0', `birthday` DATE DEFAULT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
修改列
让我们通过将其类型从" DATE"更改为" DATETIME"来修改添加到employee表中的" birthday"列。
ALTER TABLE `employee` MODIFY COLUMN `birthday` DATETIME DEFAULT NULL;
现在我们的表将如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `score` INT(11) DEFAULT '0', `birthday` DATETIME DEFAULT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
重命名列
让我们将"生日"列重命名为" dateofbirth"。
ALTER TABLE `employee` CHANGE COLUMN `birthday` `dateofbirth` DATETIME DEFAULT NULL;
现在我们的表将如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `score` INT(11) DEFAULT '0', `dateofbirth` DATETIME DEFAULT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
重命名和修改列
让我们将" dateofbirth"列重命名为" birthday",并将该列修改为" NOT NULL",然后从" DATETIME"执行为" DATE"。
ALTER TABLE `employee` CHANGE COLUMN `dateofbirth` `birthday` DATE NOT NULL;
现在我们的表将如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `score` INT(11) DEFAULT '0', `birthday` DATE NOT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
删除列
要从表中删除列,我们使用DROP COLUMN
命令。
在下面的示例中,我们从employee表中删除" temp"列。
现在,该表如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `score` INT(11) DEFAULT '0', `birthday` DATE NOT NULL, `temp` INT(11) DEFAULT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
现在,我们将从表中删除" temp"列。
ALTER TABLE `employee` DROP COLUMN `temp`;
现在,该表将如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `score` INT(11) DEFAULT '0', `birthday` DATE NOT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
添加唯一约束键
我们添加了UNIQUE KEY约束,以确保该列包含不同的值。
在下面的示例中,我们将新列" email"添加到" employee"表。
ALTER TABLE `employee` ADD COLUMN `email` VARCHAR(255) NOT NULL AFTER `lastname`;
现在,我们使它变得独一无二,这样就不会再有两个员工获得相同的电子邮件地址。
ALTER TABLE `employee` ADD UNIQUE KEY `email_employee_UNIQUE` (`email`);
现在,我们的表将如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `email` VARCHAR(255) NOT NULL, `score` INT(11) DEFAULT '0', `birthday` DATE NOT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`), UNIQUE KEY `email_employee_UNIQUE` (`email`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
删除唯一键
要删除唯一的键约束,我们使用DROP INDEX
命令。
例如,如果我们想通过符号" email_employee_UNIQUE"从" email"列中删除UNIQUE KEY约束,我们将运行以下命令。
ALTER TABLE `employee` DROP INDEX `email_employee_UNIQUE`;
添加索引
我们向列添加索引以优化搜索。
在下面的示例中,我们将索引添加到"名字"列中。
ALTER TABLE `employee` ADD INDEX `firstname_employee_INDEX` (`firstname`);
因此,我们的表将如下所示。
CREATE TABLE `employee` ( `employeeid` VARCHAR(20) NOT NULL, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL, `email` VARCHAR(255) NOT NULL, `score` INT(11) DEFAULT '0', `birthday` DATE NOT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`employeeid`), UNIQUE KEY `employeeid_employee_UNIQUE` (`employeeid`), UNIQUE KEY `email_employee_UNIQUE` (`email`), KEY `firstname_employee_INDEX` (`firstname`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
删除索引
要从列中删除索引,我们使用DROP INDEX
命令和索引符号。
In the following example we are dropping the firstname_employee_INDEX
index from the firstname
column.
ALTER TABLE `employee` DROP INDEX `firstname_employee_INDEX`;
添加外键
要将外键添加到表中,我们使用" ADD CONSTRAINT ... FOREIGN KEY"命令。
在CREATE Table教程中,我们创建了" comments"表,此表如下所示。
CREATE TABLE `comments` ( `commentid` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `commentbody` VARCHAR(200) NOT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`commentid`), UNIQUE KEY `commentid_comments_UNIQUE` (`commentid`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
现在,让我们在" commentid"列之后的" comments"表中添加一个新列" employeeid"。
" employeeid"将是外键,并将引用" employee"表的" employeeid"列。
在" columnid"之后添加新的" employeeid"列。
ALTER TABLE `comments` ADD COLUMN `employeeid` VARCHAR(20) NOT NULL AFTER `commentid`;
The foreign key column detail must match the column detail of the table it is referring to.
在上面的示例中,外键列详细信息employeeid VARCHAR(20)NOT NULL
与employee表的employeeid列详细信息相同。
现在,我们将添加外键约束。
ALTER TABLE `comments` ADD CONSTRAINT `employeeid_comments_FK` FOREIGN KEY (`employeeid`) REFERENCES `employee` (`employeeid`) ON DELETE CASCADE ON UPDATE CASCADE;
在上面的命令中," employeeid_comments_FK"用于为" employeeid"列创建索引。
"评论"表中的外键是"雇员"列。
该列是指"雇员"表的"雇员"列。
我们还有ON DELETE CASCADE ON UPDATE CASCADE
,这意味着如果employee表中的employeeid被更新或者删除,那么它将反映到注释表中。
现在,我们的注释表将如下所示。
CREATE TABLE `comments` ( `commentid` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `employeeid` VARCHAR(20) NOT NULL, `commentbody` VARCHAR(200) NOT NULL, `lastmodified` DATETIME DEFAULT NULL, `created` DATETIME NOT NULL, PRIMARY KEY (`commentid`), UNIQUE KEY `commentid_comments_UNIQUE` (`commentid`), KEY `employeeid_comments_FK` (`employeeid`), CONSTRAINT `employeeid_comments_FK` FOREIGN KEY (`employeeid`) REFERENCES `employee` (`employeeid`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=INNODB DEFAULT CHARSET=UTF8
因此,在运行外键命令时,为" employeeid"列添加了KEYemployeeid_comments_FK
。
这将有助于索引编制和搜索操作。
删除外键
要删除外键,我们使用DROP FOREIGN KEY
命令。
例如,如果我们想从comments
表中删除外键约束employeeid_comments_FK
,我们将运行以下命令。
ALTER TABLE `comments` DROP FOREIGN KEY `employeeid_comments_FK`;
为了删除添加外键时创建的索引键" employeeid_comments_FK",我们使用以下命令。
ALTER TABLE `comments` DROP INDEX `employeeid_comments_FK`;