MySQL数据库基本操作和完整性约束类型详解

目录

  • 一、增删改查的sql语句
  • 二、表完整性约束
    • 1、表完整性约束的介绍
    • 2、常见的完整性约束类型
    • 3、表完整性约束实战操作
      • 3.1.主键primary key
      • 3.2.自增键auto_increment
      • 3.3.唯一键UNIQUE
      • 3.4.null与not null
      • 3.5.默认约束

一、增删改查的sql语句

SQL(Structured Query Language 即结构化查询语言)
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
DDL语句—数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
DML语句—数据库操纵/操作语言(对记录的操作): 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DCL语句—数据库控制语言(和权限有关): 例如控制用户的访问权限GRANT、REVOKE
DQL语句—数据库查询语言: 查询数据SELECT
库相当于windows/linux中的一个目录,用于存放文件的
库里面存放了若干张表,表可以看作成是一个文件。
每一行叫做记录,除了第一行。
每一列叫一个字段。列上面的第一个叫字段名称。

创建数据库
mysql> create database 库名;

查看数据库
mysql> show databases;
​
进入数据库
mysql> use 库名
​
查看当前所在的库
mysql> select database();
创建表案例:
mysql> create table users(  
    id int primary key,     #id字段名,int数据类型,整数 primary key主键
    name varchar(30),       #name字段名,varchar(30)可变长字符串,限制30字符
    age int                 #age是字段名 数据类型是int整数,
)ENGINE=InnoDB DEFAULT CHARSET=utf8;    #指定存储引擎,设置默认的字符集

参数解释
表名:需要创建的表名
字段:表中包含的各个字段名和类型
类型:字段的类型,如int、varchar等
宽度:某些类型的长度限制,如varchar(50)
约束条件:给字段添加的约束,如primary key、 null 等
存储引擎:指定表使用的存储引擎,如InnoDB、MyISAM等
字符集:指定表使用的字符集,如utf8等

注意:在同一张表中,字段名是不能相同;宽度和约束条件是可选的;字段名和类型是必须的。

1、创建表:

mysql> create table t1(id int,name varchar(20),age int); 
             # 字段 类型 字段 类型(长度),字段 类型 
​
mysql> create table t2(id int,name varchar(50),sex enum('m','f'),age int);
#m:male  f:female 女士

2、查看有哪些表

mysql> show tables;

3、查看表结构

mysql> desc t1;

​4、查看表里面的所有记录
语法: select 内容 from 表名;

mysql> select * from t1;
#*代表所有内容

​5、查看表里面的指定字段的数据
语法:select 字段,字段 from 表名;

mysql> select name,sex from t1;

6、查看表的状态

mysql> show table status like '表名'\G    
#每条SQL语句会以分号结尾,想看的清楚一些以\G结尾,一条记录一条记录显示。
#(把表90度向左反转,第一列显示字段,第二列显示记录)使用的\G就不用添加分号了

​7、修改表名称
方式一
语法:rename table 旧表名 to 新表名;

mysql> rename table t1 to t2;
Query OK, 0 rows affected (0.00 sec)

方式二
语法:alter table 旧表名 rename 新表名;

mysql> alter table t2 rename t3;

8、使用edit(\e)编辑

mysql> \e
create table users2(
    id int primary key,
    name varchar(30),
    age int(3)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
    -> ;
#可以写新的语句,调用的vim编辑器,在里面结尾的时候不加分号,保存退出之后在加“;”

​9、删除表:在企业中是危险操作,慎用!

mysql> drop table 表名;

​10、删除库:在企业中是危险操作,慎用!

mysql> drop database 库名;

二、表完整性约束

1、表完整性约束的介绍

数据完整性指的是数据的一致性和正确性。
完整性约束是指数据库的内容必须遵守约束的规则。
若定义了数据完整性约束,MySQL会负责数据的完整性,每次更新数据时,MySQL都会测试新的数据内容是否符合相关的完整性约束条件,只有符合完整性的约束条件的更新才被接受。
作用:为了规范数据格式, 在用户进行插入、修改、删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对数据进行监测, 使不符合规范的数据不能进入数据库,以确保数据的完整性和唯一性

2、常见的完整性约束类型

约束条件说明PRIMARY KEY (PK)标识该字段为该表的主键,可以唯一的标识记录,不能为空UNIQUE + NOT NULL标识该字段的值是唯一的,且不能为空FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表之间的关联NULL标识是否允许为空,默认为NULLNOT NULL 标识该字段不能为空,可以修改UNIQUE KEY (UK)标识该字段的值是唯一的,可以为空AUTO_INCREMENT标识该字段的值自动增长(整数类型,而且为主键)DEFAULT为该字段设置默认值

主键和外键的区别:
主键用于唯一标识表中的每一行,不允许重复。而外键只是用于引用其他表中的主键,可以重复。
主键在建表时就需要定义,不能为空。而外键可以为空。
主键一般选择不重复且不易改变的字段。外键一般选择另一个表中的主键。
主键在数据修改时提供紧密控制,外键提供了表与表之间关联的链接。
删除主键记录,表中此记录将被删除。删除外键记录,外键与主键的关联会被删除,但数据仍存在。

举个简单的例子:学生表的ID字段是主键,课程表也有ID字段,但是课程表中的学生ID字段引用学生表的ID字段,课程表中的学生ID就叫外键。

​总结:

  • 主键用于标识表中的每一行
  • 外键用于关联两个表
  • 主键不允许重复
  • 外键可以重复

3、表完整性约束实战操作

3.1.主键primary key

每张表里只能有一个主键,不能为空,而且唯一,主键保证记录的唯一性,主键自动为NOT NULL。
拓展知识:
未设置主键时如何处理表?
首先Innodb从上往下搜索所有字段, 直到找到一个非空且唯一的字段, 该字段就会自动升级为主键
如果表中既没有主键, 也没有非空且唯一的字段, 那么InnoDB会采用自己内部提供的一个隐藏字段作为主键, 此时提升查询效率的作用就无法享受了(隐藏字段看不见)
即:一个UNIQUE KEY 又是一个NOT NULL的时候,那么它被当做PRIMARY KEY主键。
定义两种方式:

#表存在,添加约束
mysql> alter table t03 add primary key (hostname);

​案例:
mysql> desc  t03;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| born_year | year(4) | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)#指定born_year为主键
mysql> alter table t03 add primary key (born_year);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc  t03;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| born_year | year(4) | NO   | PRI | NULL    |       |  
+-----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

#创建表并指定主键约束
mysql> create table t9(hostname char(20),ip char(150),primary key(hostname));
mysql> insert into t9(hostname,ip) values('edu.com', '10.10.10.11');
Query OK, 1 row affected (0.00 sec)
​
mysql> insert into t9(hostname,ip) values('edu.com', '10.10.10.12');
ERROR 1062 (23000): Duplicate entry 'edu.com' for key 'PRIMARY'
#主键冲突了,主键有且只能有一个
​
mysql> insert into t9(hostname,ip) values('edu', '10.10.10.11');
Query OK, 1 row affected (0.01 sec)
​
mysql> select * from t9;
+-----------+-------------+
| hostname  | ip          |
+-----------+-------------+
| edu       | 10.10.10.11 |
| edu.com   | 10.10.10.11 |
+-----------+-------------+
2 rows in set (0.00 sec)
​
mysql> insert into t9(hostname,ip) values('jy', '10.10.10.12');
Query OK, 1 row affected (0.00 sec)
#可以插入成功,因为ip并不是主键
​
mysql> select * from t9;
+-----------+-------------+
| hostname  | ip          |
+-----------+-------------+
| edu       | 10.10.10.11 |
| edu.com   | 10.10.10.11 |
| jy        | 10.10.10.12 |
+-----------+-------------+
3 rows in set (0.00 sec)#删除主键
mysql> alter table t9  drop  primary key;#再查看一下表结构,看看hostname是否为主键了
mysql> desc  t9;

3.2.自增键auto_increment

设置后,会自动编号,且必须与主键组合使用,默认情况下,起始值为1,每次的增量为1。
当插入数据时,如果为AUTO_INCREMENT数据列明确指定了一个数值

则会出现两种情况:
1、如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;
2、如果插入的值大于已编号的值,则会把它插入到数据列中,并在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。
每张表只能有一个字段为自增,而且必须要成了key也就是主键才可以自动增长

案例

mysql> CREATE TABLE department3 (
    dept_id INT PRIMARY KEY AUTO_INCREMENT,
    dept_name VARCHAR(30),
    comment VARCHAR(50)
    );
上述案例是创建了一个department3(部门3)的表格,并且将dept_id部门id设置成了主键和自增键,后续添加了一个部门成员就会自动加1
查看表结构:

mysql> select * from department3;
Empty set (0.00 sec)

#插入数据,一次插入2条数据,它会自动增加id号,从1开始自增
mysql> insert into department3(dept_name, comment) values('tom','test'), ('jack', 'test2');
Query OK, 2 rows affected (0.00 sec)

mysql> select * from department3;
+---------+-----------+---------+
| dept_id | dept_name | comment |
+---------+-----------+---------+
|       1 | tom       | test    |
|       2 | jack      | test2   |
+---------+-----------+---------+
2 rows in set (0.00 sec)

#也可以指定id插入,直接跳过3和4
mysql> insert into department3(dept_id,dept_name,comment)  values('5','bob','test5');
Query OK, 1 row affected (0.00 sec)

#或者,不指定字段也是可以的,不指定具体的字段就是必须要插入3个数据值
mysql> insert into department3  values('6','jary','test6');

#查询数据
mysql> select * from department3;
+---------+-----------+---------+
| dept_id | dept_name | comment |
+---------+-----------+---------+
|       1 | tom       | test    |
|       2 | jack      | test2   |
|       5 | bob       | test5   |
|       6 | jary      | test6   |
+---------+-----------+---------+

#删除自动增长
#语法:ALTER TABLE table_name CHANGE  old_col_name new_col_name column_definition(列定义约束条件)
mysql> ALTER TABLE department3 CHANGE dept_id  dept_id INT NOT NULL;
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> desc department3;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| dept_id   | int(11)     | NO   | PRI | NULL    |       |
| dept_name | varchar(30) | YES  |     | NULL    |       |
| comment   | varchar(50) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

3.3.唯一键UNIQUE

设置唯一约束UNIQUE,字段添加唯一约束之后,该字段的值不能重复,也就是说在一列当中不能出现一样的值。
案例

mysql> CREATE TABLE department2 (
     dept_id INT,
     dept_name VARCHAR(30) UNIQUE,
     comment VARCHAR(50)
     );
Query OK, 0 rows affected (0.00 sec)

#插入第一条数据
mysql> insert into department2(dept_id,dept_name,comment) values('1','tom',good'')

#插入第二条数据
mysql> insert into department2(dept_id,dept_name,comment) values('2','tom',good'')
ERROR 1062 (23000): Duplicate entry 'tom' for key 'dept_name'
#插入数据的时候id和comment字段相同可以插入数据,如果有相同的名字不唯一。所以插入数据失败。

#将名字换掉再次插入
mysql> insert into department2(dept_id,dept_name,comment) values('2','jack',good'')
Query OK, 1 row affected (0.00 sec)

#插入第三条数据,id可以相同,名字不能相同
mysql> insert into department2(dept_id,dept_name,comment) values('2','jim',good'')
Query OK, 1 row affected (0.00 sec)

mysql> select * from department2;
+---------+-----------+---------+
| dept_id | dept_name | comment |
+---------+-----------+---------+
|       1 | tom       | good    |
|       2 | jack      | good    |
|       2 | jim       | good    |
+---------+-----------+---------+
3 rows in set (0.00 sec)

3.4.null与not null

是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
字段是否有默认值,默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值,也就是空值

例如:sex enum('male','female') not null default 'male'
只能选择male和female,不允许为空,默认是male
案例:不允许为空not null

#创建表格
mysql> create table t2(id int(5),name varchar(10),sex enum('male','female') not null default 'male');
Query OK, 0 rows affected (0.00 sec)

#查看表结构
mysql> desc  t2;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(5)                | YES  |     | NULL    |       |
| name  | varchar(10)           | YES  |     | NULL    |       |
| sex   | enum('male','female') | NO   |     | male    |       |
+-------+-----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

#插入数据
mysql> insert into t2(id,name) values(1,'tom');

#查询数据
mysql> select * from t4;
+------+------+------+
| id   | name | sex  |
+------+------+------+
|    1 | tom  | male |
+------+------+------+
1 row in set (0.00 sec)

#再插入一条
mysql> insert  into t2 values(1,'jack','female');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t2;
+------+------+--------+
| id   | name | sex    |
+------+------+--------+
|    1 | tom  | male   |
|    1 | jack | female |
+------+------+--------+
2 rows in set (0.00 sec)

#加错了,删掉,使用delete删除
#语法:DELETE FROM table_name WHERE column_name = 'value';
#多条件匹配:DELETE FROM table_name WHERE column_name1 = 'value1' AND column_name2 = 'value2';
#操作:
mysql> delete from  t2 where name='jack';
Query OK, 1 row affected (0.00 sec)

mysql> select * from t2;
+------+------+------+
| id   | name | sex  |
+------+------+------+
|    1 | tom  | male |
+------+------+------+
1 row in set (0.00 sec)
#允许为空null
mysql> create table t3(id int(5),name varchar(10),age int(5));
Query OK, 0 rows affected (0.00 sec)

#查看表结构
mysql> desc t3;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(5)      | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
| age   | int(5)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> insert into t3(id,name) values(1,'tom');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t3;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | tom  | NULL |
+------+------+------+
1 row in set (0.00 sec)
指定字符集:
#在创建表的最后面指定一下: default charset=utf8 
mysql> create  table  t4(id int(5)) default charset=utf8;
Query OK, 0 rows affected (0.01 sec)

3.5.默认约束

添加/删除默认约束

#创建一个表
mysql> create table user(id int not null, name varchar(20), number int, primary key(id));
Query OK, 0 rows affected (0.01 sec)

mysql> describe user;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(20) | YES  |     | NULL    |       |
| number | int(11)     | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

#设置默认值,将number这个字段设置成:不给这个字段赋值时,默认为0,而不是为空
mysql> ALTER TABLE user ALTER number SET DEFAULT 0;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESCRIBE user;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(20) | YES  |     | NULL    |       |
| number | int(11)     | YES  |     | 0       |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

#将id这个字段设置成自增建
mysql> ALTER TABLE user CHANGE id id INT NOT NULL AUTO_INCREMENT;
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

#查看表结构
mysql> desc user;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| number | int(11)     | YES  |     | 0       |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

#插入数据
mysql> INSERT INTO user(name) VALUES('rock'); 
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO user(name) VALUES('rock');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+------+--------+
| id | name | number |
+----+------+--------+
|  1 | rock |      0 |
|  2 | rock |      0 |
+----+------+--------+
2 rows in set (0.00 sec)

#如果我想自己填number的值,也是可以的
mysql> insert into user values('3','rock1','2');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+-------+--------+
| id | name  | number |
+----+-------+--------+
|  1 | rock  |      0 |
|  2 | rock  |      0 |
|  3 | rock1 |      2 |
+----+-------+--------+
3 rows in set (0.00 sec)

#不指定自增建的值,也是可以的,它会自动增加
mysql> insert into user(name,number) values('jack','4');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;                            
+----+-------+--------+
| id | name  | number |
+----+-------+--------+
|  1 | rock  |      0 |
|  2 | rock  |      0 |
|  3 | rock1 |      2 |
|  4 | jack  |      4 |
+----+-------+--------+
4 rows in set (0.00 sec)

#删除默认值
mysql> ALTER TABLE user ALTER number drop DEFAULT;

#再次查看表结构
mysql> desc  user;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| number | int(11)     | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
#就能看到number这个字段的Default为空了

你可能感兴趣的:(MySQL数据库,数据库,mysql,centos,linux)