MySQL-修改表

时间:2020-02-23 14:40:59  来源:igfitidea点击:

在本教程中,我们将学习如何在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_INDEXindex from the firstnamecolumn.

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`;