- not null约束。
not null约束只能在列名后面声明,不能使用constraint语句声明,当然也就没无法声明约束名称了。更改字段为null或者not null只能使用alter table table_name modify col_name (not) null;无法使用constraint语句修改。也就是说not null虽然是约束,但是却和constraint语句扯不上关系。not null约束在information_schema里面的table_constraints表中也无法查到。
- 主键约束。
主键约束既可以在列名后面声明,也可以在声明完所有列之后声明。前者只需要在列明后面跟上primary key就行了,后者的声明方法是[CONSTRAINT [symbol]] PRIMARY KEY(COL1,...),这里声明约束名称是没有任何意义的,因为你假如使用CONSTRAINT [symbol]语句之后,MySQL会自动把约束名称改为PRIMARY,可以到information_schema里面的table_constriants表里面验证。所以我们在声明所有列再声明primary key都不会使用constraint关键字。主键即唯一索引加上not null约束,主键列上会创建唯一索引,索引的名称和约束名称相同,默认为BTREE索引,索引信息可以在information_schema里面的statistics表里面查询。
删除主键约束使用alter table table_name drop primary key;
- unique约束。
unique约束也可以称为unique索引,因为二者都是同时存在。创建表的时候可以使用如下两种方法创建unique约束:
(1)create table t1(id int primary key,name varchar(20) unique);无法指定约束名称,系统默认约束名称和字段名相同。
(2)create table t1(id int primary key,name varchar(20),constraint t1_unq unique(name));
表已经存在时可以通过两种方式添加unique约束。
(1)alter table t1 modify name varchar(20) unique;
(2)alter table t1 add constraint t1_unq unique(name);
(3)alter table t1 add unique index t1_unq(name);
因为unique约束就是unique索引,所以我们都会用第三种方式去添加unique索引,如果不带unique关键字则说明添加的是普通索引。unique约束(unique索引)的信息会同时在information_schema里面的statistics表和table_constraints表里面保持一致。
删除unique约束(索引)只能使用如下语句:
alter table t1 drop index t1_unq;
4. 外键约束。
在建表时创建外键约束可以使用如下方法(注意被引用的表的那个列必须有unique约束):
(1)create table t1(id int primary key, name varchar(20) references t2(name));该方法无法声明约束名称。
(2)create table t1(id int primary key,name varchar(20), constraint t1_fk_name foreign key(name) references t2(name));该方法可以声明约束名。
在表已经存在的时候添加外键约束可以使用如下语句:
alter table add constraint t1_fk_name foreign key(name) references t2(name));
删除外键可以使用如下语句:
alter table drop foreign key t1_fk_name;
MySQL之约束注意点