也就是说,change和modify都可以修改列的定义,包括约束类的属性、字段的位置,且change比modify更多一个重命名列的功能。而alter column则只能设置默认值和删除默认值。注意,重命名和修改字段时,需要重新定义字段属性。
1.8 添加、删除字段和约束首先需要说明的是,MySQL中任何存储引擎都不支持check约束,官方手册上说明了会对check语句进行读取检查,但是不会生效,也就是即使是对的check约束也是被忽略的。要在MySQL中实现check约束可以考虑使用触发器或者通过数据类型来限制。
-- MySQL中添加、删除字段和约束的语法 -- 添加字段 | ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ] | ADD [COLUMN] (col_name column_definition,...) -- 可以一次性添加多个字段 -- 删除字段 | DROP [COLUMN] col_name -- 添加约束 | ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) [index_option] ... | ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) [index_option] ... -- 删除约束 | DROP PRIMARY KEY | DROP FOREIGN KEY fk_symbol | DROP {INDEX|KEY} index_name | DISABLE KEYS | ENABLE KEYS -- 添加和删除默认值约束 | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}对于MariaDB,从10.2.1开始,其支持DROP CONSTRAINT子句,并引入了DEFAULT约束,还支持check约束。且在MariaDB 10.0.2版本之后,操作字段时甚至支持if exists和if not exists。包括如下情况:
ADD COLUMN [IF NOT EXISTS] ADD INDEX [IF NOT EXISTS] ADD FOREIGN KEY [IF NOT EXISTS] ADD PARTITION [IF NOT EXISTS] CREATE INDEX [IF NOT EXISTS] DROP COLUMN [IF EXISTS] DROP INDEX [IF EXISTS] DROP FOREIGN KEY [IF EXISTS] DROP PARTITION [IF EXISTS] CHANGE COLUMN [IF EXISTS] MODIFY COLUMN [IF EXISTS] DROP INDEX [IF EXISTS]对于SQL Server,不管是什么约束,都能使用下面的语句进行删除,但MySQL有些麻烦,见下文具体说明:
alter table table_name drop constraint constraint_name
添加/删除字段
-- SQL Server添加字段,只能一个字段一个字段添加 alter table emp add name char(20) -- MySQL添加字段,可以一次添加一个字段,也可以一次添加多个字段 ALTER TABLE emp ADD NAME CHAR(20) NOT NULL; ALTER TABLE emp ADD (gender CHAR(6) NOT NULL DEFAULT 'male',phone CHAR(11));
添加/删除主键、外键约束
/*添加主键约束*/ -- SQL Server alter table emp10 add constraint pk_id primary key clustered(id); -- MySQL添加主键 ALTER TABLE emp10 ADD CONSTRAINT pk_id PRIMARY KEY (id); -- 添加外键约束,SQL Server和MySQL相同 ALTER TABLE emp10 ADD CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES emp20(id); -- MySQL删除主键、外键(需要先删除外键) alter table emp10 drop foreign key fk_id; alter table emp10 drop primary key;