Java养成计划----学习打卡第七十三天
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
上面提到了主键约束,那么什么是主键约束
主键约束
:是一种约束
主键字段
: 添加了主键约束的字段就是主键字段
主键值
: 主键字段中的每一个值,叫做主键值
-
那什么是主键?
主键就是每一行记录的唯一标识,相当于每一行记录的身份证号码,一行记录对应的就是一个数据,识别该数据的依据就是主键;主要主键不同,其他数据完全相同就是那数据就是不一样的
-
任何一张表都应该有主键,没有主键那么表无效
-
主键的特征 : 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)