VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > MySQL >
  • MYSQL约束的添加和删除

在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类型或者触发器来实现,这里就不深究了。


相关教程