Java养成计划----学习打卡第七十三天
内容导航- 两个字段联合唯一 表级约束
- 约束的联合
- 主键约束 primary key PK
Java(打卡第七十一二三天)
最近忙于数电实验,如果有关于verilog方面的问题,欢迎交流学习
先简单查询一下之前的内容,查询city表前200的城市,按照Countrycode分组后,每个分组的平均人口大于400000之上的组,按照降序输出前5个
mysql> SELECt -> CountryCode,AVG(Population) AS 'Avgpop' -> FROM -> city -> WHERe -> ID <= 200 -> GROUP BY -> CountryCode -> HAVINg -> AVG(Population) > 400000 -> ORDER BY -> Avgpop DESC -> LIMIT -> 5; +-------------+-------------+ | CountryCode | Avgpop | +-------------+-------------+ | AUS | 808119.0000 | | AZE | 616000.0000 | | AFG | 583025.0000 | | ARM | 544366.6667 | | AGO | 512320.0000 | +-------------+-------------+ 5 rows in set (0.00 sec)
同时关于修改的UPDATe,删除的DELETE,插入的INSERT,表结构的删除就不再赘述,接下来继续来看约束的部分
mysql> CREATE TABLE t_student( -> name VARCHAr(25) NOT NULL, -> sex CHAr(1) NOT NULL, -> idno INT DEFAULT 45 UNIQUE -> ); Query OK, 0 rows affected (0.06 sec) mysql> INSERT INTO -> t_student -> (name,sex,idno) -> VALUES -> ('Linda','男',1); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO -> t_student -> (sex,idno) -> VALUES -> ('男',1); ERROR 1364 (HY000): Field 'name' doesn't have a default value mysql> INSERT INTO -> t_student -> (name,sex) -> VALUES -> ('LI','女'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO -> t_student -> (name,sex) -> VALUES -> ('Wng','男'); ERROR 1062 (23000): Duplicate entry '45' for key 't_student.idno' mysql> SELECT * FROM t_student; +-------+-----+------+ | name | sex | idno | +-------+-----+------+ | Linda | 男 | 1 | | LI | 女 | 45 | +-------+-----+------+ 2 rows in set (0.00 sec)
上面完整地实验了非空约束和唯一性约束,所以一般加了唯一性约束的字段就不再使用DEFAULT了,因为不能重复
null代表空,不表示一个具体的值,所以可以同时为NULL
两个字段联合唯一 表级约束比如上面要求姓名和idno联合起来唯一,注意联合起来唯一和每一个都有唯一性约束时不一样的,联合唯一其中一个字段重复,另一个字段不重复时可以的,但是都唯一就都不能重复
这个时候的语法格式就和单独唯一或者其他的 *** 作不一样了,之前就是在每一列,就是每一个字段后面加上唯一UNIQUE或者NULL
在创建表的最后一项,单独一列来表示约束,并加上字段
mysql> CREATE TABLE t_student( -> name VARCHAr(25) NOT NULL, -> sex CHAr(1) NOT NULL, -> idno INT NOT NULL, -> UNIQUE(name,idno) -> ); Query OK, 0 rows affected (0.04 sec)
这里就是将name和idno联合唯一,可以实验一下
mysql> INSERT INTO t_student VALUES ('Linda','女'); ERROR 1136 (21S01): Column count doesn't match value count at row 1 mysql> INSERT INTO t_student VALUES ('Linda','女',1); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO t_student VALUES ('Linda','女',2); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t_student VALUES ('Linda','女',2); ERROR 1062 (23000): Duplicate entry 'Linda-2' for key 't_student.name'
ERROR 1062 (23000): Duplicate entry ‘Linda-2’ for key ‘t_student.name’
这里报错都是联合报错的,不是单独提示的某一个字段
约束直接加在列的后面叫做列级约束,约束加在最后一行叫做表级约束
需要给多个字段联合起来添加某一个约束的时候,就要使用表级约束,其他的就使用列级约束就可以了
NOT NULL只有列级约束,没有表级约束
约束的联合上面是多个字段同时使用同一个约束,这个时候使用的是表级约束,那么同一个字段也是可以使用多个约束的,比如给同一个字段加上unique和not null, 格式就是
col_name 约束1 约束2,
这里就可以给name同时加上两个约束来看一下创建是否成功
ysql> CREATE TABLE t_student( -> name VARCHAr(25) NOT NULL UNIQUE, -> sex CHAr(1) DEFAULT '男', -> idno INT NOT NULL -> ); Query OK, 0 rows affected (0.02 sec) mysql> DESC t_student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(25) | NO | PRI | NULL | | | sex | char(1) | YES | | 男 | | | idno | int | NO | | NULL | | +-------+-------------+------+-----+---------+-------+
可以发现当name被NOT NULL 和 UNIQUE联合约束之后,就被默认当作主键约束primary key
在MySQL中,当一个字段同时被NOT NULL和UNIQUE约束后,该字段自动变成一个主键约束的字段,注意: Oracle中不一样!)
所以一般就很少联合,直接使用主键约束就可以了
主键约束 primary key PK上面提到了主键约束,那么什么是主键约束
主键约束:是一种约束
主键字段: 添加了主键约束的字段就是主键字段
主键值: 主键字段中的每一个值,叫做主键值
-
那什么是主键?
主键就是每一行记录的唯一标识,相当于每一行记录的身份z号码,一行记录对应的就是一个数据,识别该数据的依据就是主键;主要主键不同,其他数据完全相同就是那数据就是不一样的
-
任何一张表都应该有主键,没有主键那么表无效
-
主键的特征 : NOT NULL UNIQUE --------- 【不能为空,并且不能重复】
给字段加上主键的方式
col_name 数据类型 PRIMARY KEY,
这里可以试一试效果
mysql> CREATE TABLE t_student( -> name VARCHAr(25) PRIMARY KEY, -> sex CHAr(1) DEFAULT '男', -> idno INT NOT NULL -> ); Query OK, 0 rows affected (0.04 sec) mysql> DESC t_student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(25) | NO | PRI | NULL | | | sex | char(1) | YES | | 男 | | | idno | int | NO | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
效果就是NOT NULL和UNIQUE联合
mysql> INSERT INTO t_student VALUES ('Lin','男',1); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO t_student VALUES ('Lin','男',1); ERROR 1062 (23000): Duplicate entry 'Lin' for key 't_student.PRIMARY' mysql> INSERT INTO t_student (sex,idno) VALUES ('男',1); ERROR 1364 (HY000): Field 'name' doesn't have a default value
这里重复和空都报错了ERROR 1062 (23000):,ERROR 1364 (HY000):
Duplicate entry ‘Lin’ for key ‘t_student.PRIMARY’ ----- 这里就是直接识别的key PRIMARY
- 主键约束除了直接使用列级约束的方式,还可以使用表级约束
mysql> CREATE TABLE t_student( -> name VARCHAr(25), -> idno INT NOT NULL, -> PRIMARY KEY(name) -> ); Query OK, 0 rows affected (0.03 sec)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)