字段约束的使用和唯一索引和主键

本文详细介绍了MySQL中创建数据库表时的字段约束,包括NOT NULL、DEFAULT、UNIQUE以及PRIMARY KEY。通过示例展示了如何设置和验证这些约束,以及主键与auto_increment属性的结合使用,强调了主键的重要性及其在自增长表头中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字段约束的使用
建表时给表头设置默认和不允许赋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)
```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值