在MYSQL数据库中,建表时就可以进行对表的各项进行一些操作,例如设置主键或者非空约束,这里主要讲讲如何在建表后进行添加约束和删除约束
首先,建一个十分普通的表
create table test(
test_no char(10),
test_point int,
test_student char(11));
这里有test_no,test_point,test_student三列,此时没有任何约束。
常用的约束有1、主键约束。2、非空约束。3、外键约束。4、唯一约束。5、check(检查)约束
如果我们想要让test_no列作为主键
alter table test add primary key(test_no);
即可设置test_no列为主键。
这里如果我们要设置test_student为唯一约束,在命令行可以敲上述代码的类比形式
alter table test add unique(test_student);
但现在我认为test_no作为主键不太合适,于是想要删除它
alter table test drop primary key; 直接就可以删除该表中的主键
在删除主键时,由于主键对于一个表来说是唯一的,那么对于一个表的唯一约束却可以是有很多的,而使用上述方法建立唯一约束,是不知道约束名称的,当然,默认该约束的名称等于该列的名称,但是如果修改了这列的名称,而约束的名称确是不会改变的,这样在修改的时候容易引起问题,最好的方法是查看该表的约束再进行操作,使用下列代码
show keys from test;
观察到我之前设置的唯一性约束
我想删除这个约束
Alter table test index test_student;
再次使用show keys from test就为空了。
外键约束
外键约束其实是将主表的某些列和子表的某些列关联在一起,其目的是为了不让子表的列随意增加主表列中不存在的项,也就是如果主表中的test_no如果没有111111111这个编号,那么子表中的test_no 也不能插入有关这个编号的列
首先建立一个主表
create table test1(
test_no char(10),
test_sem int);
同样没有任何约束,这时直接使用之前的alter语句建立外键约束。
alter table test add foreign key N1(test_no) references test1(test_no); # 注:使用alter语句的才是子表,也就是受约束的表
发现报错,ERROR 1215 (HY000): Cannot add foreign key constraint,为什么呢,因为对于主表的列来说,没有主键约束和唯一性约束的列是没有资格作为列建立外键约束的。所以我们要给它添加一些东西
alter table test1 add primary key (test_no);
然后alter table test add foreign key (test_no) references test1(test_no);实现了外键约束。这样的约束创建,外键名称是列名或者一个其他生成的名称,需要用show create table test来查看,观察到表的结构语句中已经有了外键,并且外键名称为test_ibfk_1
首先,删除外键约束
alter table test drop foreign key test_ibfk_1;
然后想想怎么设计一个自己想要的外键名称,观察上面的结构语句可以受到启发,模仿上面的语句尝试一下。
alter table test add constraint N1 foreign key (test_no) references test1(test_no);
发现key名为N1,成功添加约束,但是如果再次删除约束N1,外键消失,但是索引N1仍然保留。
仍然保留的原因是因为使用了constraint,具体暂时不准备解释,注意一下就行。
这时向子表中插入数据insert into test values('1234567890',99,'name');
报错,观察原因,显然是因为子表中的列受到限制了
这时向父表中增加一些东西,依次执行
insert into test1 values('1234567890',2);
insert into test values('1234567890',99,'name');
显然成功了,外键约束十分方便的限制了一些东西,这在实际设计中能够避免许许多多的数据错误。
not null 约束就不谈了,和primary key 和 unique 一样,它实在没有什么太多好讲的。这里写一下怎么建立和删除非空约束。
alter table test modify test_student char(10); 删除非空约束
其中modify 的意思可以理解为重构,你甚至可以用modify来进行对其他约束的创建,例如 alter table modify test_student char(10) unique; 这样可以直接建立唯一约束。所以,modify是十分方便的。
alter table test modify test_student char(10) not null; 建立非空约束
最后说说怎么建立check约束和常用在哪里。
先说说常用在哪里,比如一个表中记录了员工的姓名,性别和年龄,姓名有最大长度,这体现于它的结构,例如 name char(8)
但是对于性别和年龄,性别只有男和女,年龄不大于80岁可能和小于16岁(温馨提示:雇佣童工犯法),这里用结构难以直接约束它,所以要用到check
先建表 create table worker(name char(8),sex char(2), age int);
为它建立约束alter table worker add check(sex in ('男','女'));没有报错
但是insert into worker values("Jack","a",18);
不会报错,这是因为mysql 对于check会进行解析,但check约束实际无效。而要实际实现check约束的功能一般使用enum类型或者触发器来实现,这里就不深究了。