一、是否允许为空 null 、not null
规定一个字段的值,是否可以为null,默认允许为空
null not null
create table php1( a int not null, b int );
若字段不允许为空,还没默认值,插入一条记录时,自然会报错,但是报的错误是没有默认值,从此错误可以看出,当不允许为空的字段,插入记录,不插入此字段时,会先找默认属性值,若没有,才报错,在二中就指定了属性值,所以没报错
二、默认属性值:default value
create table php2(a it not null default 10, b int not null 21)
在含有默认值的情况下,即使有列属性not null,插入时此值不写,也能插入成功
insert into php2 values(null,null);不能插入,因为不允许为空。
create table php3( a int not null default 10,b int default 21);
insert into php3 values (20,null);
b 允许为空,所以赋null也可以
一、二常见的用法:一个字段不能为空,而且存在默认值
三、主键 primary key
定义:可以唯一表示,某条记录的字段或者字段的集合
主键的规则: 可以是真实实体的属性,但是常用的好的解决方案是利用一个与实体不相关的属性,作为唯一的标识,只是用于标识记录
第一种定义格式:
create table teacher(t_id int primary key, t_name varchar(5),class_name varchar (6),days tinyint unsigned);
第二种定义格式:
create table teacher1( t_id int, t_name varchar(5),class_name varchar(6), days tinyint unsigne primary key(t_id));
这两种格式如何选取:当是字段集合作为主键是,通常用第二种格式,中间用“,”隔开
注意是一个主键包含多个字段,而不是多个字段都是主键。
①主键在一个表中必须唯一
②主键字段在插入时不能为空,只要是主键,就暗含了not null条件,否则会报错
若字符串中含有中文, set names gbk; utf8在sql中并不能很好的支持中文。
insert into teacher values(2,’张家明哈哈’,’02’,44);//varchar(5),最多为5个中文,或者最多5个字母,无论字母还是中文都是一个字符。
③主键可以作为查找的条件
select * from teacher where t_id=1;
④常见的设计:每个表中都应该有唯一标识的主键字段,最好与实体没联系
四、自动增长auto_increment
为每条记录提供唯一的标识,每次插入记录时,将某个字段的值自动增长1,使用auto_increment标识。
需要整型,还需要索引
①一般把自动增长写在主键上,主键就是一种索引
create table teacher2(t_id int primary key auto_increment, t_name varchar(5),class_name varchar(6), days tinyint unsigned);
两种插入数据的方式,因为有自动增长,所以可以写null,或者不写此字段
insert into teacher2 values(null,’小B’,’03’,23);
insert into teacher2(t_name,class_name,days) values(‘小C’,’04’,53);
②自动增长有时需要从某个值开始,而不是都从1(默认)开始
alter table teacher2 auto_increment=50;(修改表定义,而不是某列的定义)
有时可能多次设置自动增长的值,但是插入都是从大的增长值之后增长的,因为随着数据的增加,若从小的处增长,会与大的自动增长时设的数据重复,造成主键不唯一的情况,所以从大的开始增长
③是否可以手动增长?
可以手动插入,但是要保证主键唯一。若自动增长的字段不是主键,则可以重复
insert into teacher2 values (3,’小F’,’05’,78);
④自动增长的列可以进行手动更新
update teacher2 set t_id=4 where t_id=100;(注意在sql中“=”就是判断,而不是赋值)
⑤开始设置了自动增长为20,然后自动添加到表中的元素,自然从20开始,比如插入20,21,然后删除20之后的元素,再插入元素时,从22开始插入