字段约束的使用
建表时给表头设置默认和不允许赋null值
mysql> create table db1.t31(
name char(10) not null , #name表头赋值的时候不能写null
class char(7) default "nsd",
likes set("money","game","film","music") not null default "film,music" );
查看表头
mysql> desc db1.t31;
+-------+------------------------------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------------------------+------+-----+------------+-------+
| name | char(10) | NO | | NULL | |
| class | char(7) | YES | | nsd2107 | |
| likes | set('money','game','film','music') | NO | | film,music | |
+-------+------------------------------------+------+-----+------------+-------+
验证默认值和不允许为null
表头name赋null值 报错
mysql> insert into db1.t31 values (null, null , null);
ERROR 1048 (23000): Column 'name' cannot be null
表头likes赋null值 报错
mysql> insert into db1.t31 values ("bob", null , null);
ERROR 1048 (23000): Column 'likes' cannot be null
符合约束不报错
mysql> insert into db1.t31 values ("bob",null,"money,game,film");
Query OK, 1 row affected (0.06 sec)
不赋值的表头使用默认值赋值
mysql> insert into db1.t31(name) values("jim");
根据需要自定义表头的值
mysql> insert into db1.t31 values ("lucy","nsd2108","game,film");
mysql> select * from db1.t31;
------+---------+-----------------+
| name | class | likes |
+------+---------+-----------------+
| bob | NULL | money,game,film |
| jim | nsd2107 | film,music |
| lucy | nsd2108 | game,film |
+------+---------+-----------------+
唯一索引 (unique)
约束的方式:表头值唯一 , 但可以赋null 值
例子
mysql> create database if not exists DB1;
create table DB1.t43 (姓名 char(10) , 护照 char(18) unique );
mysql> desc DB1.t43 ;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
| 护照 | char(18) | YES | UNI | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
#key这里要有UNI值表示唯一索引
赋null值 可以
mysql> insert into DB1.t43 values("bob",null);
mysql> insert into DB1.t43 values("tom","666888");
表头值重复不可以
mysql> insert into DB1.t43 values("jim","666888");
ERROR 1062 (23000): Duplicate entry '666888' for key 'hz_id'
不重复 可以
mysql> insert into DB1.t43 values("jim","766888");
查看表记录
mysql> select * from DB1.t43;
+------+--------+
| 姓名 | 护照 |
+------+--------+
| bob | NULL |
| tom | 666888 |
| jim | 766888 |
+------+--------+
3 rows in set (0.00 sec)
主键
约束方式:表头值不允许重复,且不允许赋NULL值
使用说明:
1、表中只能有一个主键表头
2、多个表头做主键,称为复合主键,必须一起创建
3、主键标志PRI
4、主键通常与auto_increment 连用
5、通常把表中唯一标识记录的表头设置为主键[记录编号表头]
语法格式1
create table 库.表( 表头名 数据类型 primary key , 表头名 数据类型 , ..... );
例子
mysql> create table db1.t35(
name char(10) ,
hz_id char(10) primary key , #加了主键的标志
class char(10)
);
查看表头
mysql> desc db1.t35;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | | 姓名
| hz_id | char(10) | NO | PRI | NULL | | 身份证号
| class | char(10) | YES | | NULL | | 班级
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec) #会出现PRI的标志
语法格式2
create table 库.表( 字段名 类型 , 字段名 类型 , primary key(字段名) );
例子
mysql> create table db1.t36(
name char(10) ,
hz_id char(10) ,
class char(10),
primary key(hz_id)
);
删除主键
命令格式
mysql> alter table 库.表 drop primary key ;
例子
mysql> alter table db1.t36 drop primary key ;
mysql> desc db1.t36;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| hz_id | char(10) | NO | | NULL | |
| class | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
添加主键
命令格式
mysql> alter table 库.表 add primary key(表头名);
例子
mysql> alter table db1.t36 add primary key(hz_id);
mysql> desc db1.t36;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| hz_id | char(10) | NO | PRI | NULL | |
| class | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
```
##### 主键与auto_increment连用:
```nginx
表头设置了auto_increment属性后,
插入记录时,如果不给表头赋值表头通过自加1的计算结果赋值
要想让表头有自增长 表头必须有主键设置才可以
查看表结构时 在 Extra (额外设置) 位置显示
auto_increment中文:自增长
建表时 创建有auto_increment 属性的表头。实现的效果如下:
行号 姓名 班级 住址
1 bob nsd2107 bj
2 bob nsd2107 bj
3 bob nsd2107 bj
4 bob nsd2107 bj
例子
create table db1.t38 (
行号 int primary key auto_increment ,
姓名 char(10) ,
班级 char(7) ,
住址 char(10)
);
或
create table db1.t39 (
行号 int auto_increment ,
姓名 char(10) , 班级 char(7) , 住址 char(10) ,
primary key(行号)
);
查看表头
mysql> desc db1.t38;
+--------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+----------------+
| 行号 | int(11) | NO | PRI | NULL | auto_increment |
| 姓名 | char(10) | YES | | NULL | |
| 班级 | char(7) | YES | | NULL | |
| 住址 | char(10) | YES | | NULL | |
+--------+----------+------+-----+---------+----------------+
(有主键才能设置自增长)
(只要是主键就默认不能赋空值)
(自增长在extar这里显示)
插入表记录 不给自增长表头赋值
mysql> insert into db1.t39(姓名,班级,住址)values("bob","nsd2107","bj");
mysql> insert into db1.t39(姓名,班级,住址)values("bob","nsd2107","bj");
mysql> insert into db1.t39(姓名,班级,住址)values("tom","nsd2107","bj");
查看表记录
mysql> select * from db1.t39;
+--------+--------+---------+--------+
| 行号 | 姓名 | 班级 | 住址 |
+--------+--------+---------+--------+
| 1 | bob | nsd2107 | bj |
| 2 | bob | nsd2107 | bj |
| 3 | bob | nsd2107 | bj |
+--------+--------+---------+--------+
给表头输入null(无)的话也自加一,相当于占位。
删除所有行
mysql> delete from db1.t39 ;
再添加行 继续行号 而不是从 1 开始
mysql> insert into db1.t39(姓名,班级,住址)values("lucy","nsd2107","bj");
mysql> insert into db1.t39(姓名,班级,住址)values("lucy","nsd2107","bj");
mysql> insert into db1.t39(姓名,班级,住址)values("lucy","nsd2107","bj");
查看记录
mysql> select * from db1.t39;
+--------+--------+---------+--------+
| 行号 | 姓名 | 班级 | 住址 |
+--------+--------+---------+--------+
| 8 | lucy | nsd2107 | bj |
| 9 | lucy | nsd2107 | bj |
| 10 | lucy | nsd2107 | bj |
+--------+--------+---------+--------+
3 rows in set (0.01 sec)
```