Bootstrap

MySQL 联合约束,主键引入【MySQL】

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)
;