约束条件

default默认值

  1. create table t1(
  2. id int,
  3. gender enum('male','female','others') default 'male'
  4. );
  5. #插入一条语句,不填gender值,默认为male
  6. insert into t1(id) values(1);

unique唯一

  1. #单列唯一
  2. create table t3(
  3. id int unique,
  4. name char(16)
  5. );
  6. insert into t3 values('1','jason'),('1','egon'); #报错
  7. insert into t3 values('1','jason'),('2','egon'); #正常
  8. #联合唯一
  9. """
  10. 例如ip和port
  11. 单个都可以重复,但加载在一起必须是唯一的
  12. """
  13. create table t4(
  14. id int,
  15. ip char(16)
  16. port int,
  17. unique(ip,port)
  18. );
  19. insert into t4 values(1,'127.0.0.1',8080);
  20. insert into t4 values(2,'127.0.0.1',8081);
  21. insert into t4 values(3,'127.0.0.2',8080);
  22. insert into t4 values(4,'127.0.0.1',8080); #报错

primary key 主键

  1. """
  2. 1. 但从约束效果上来看,primary key等价于 not null + unique
  3. 非空且唯一
  4. """
  5. create table t5(id int primary key);
  6. insert into t5 values(unll); #报错
  7. insert into t5 values(1),(1); #报错
  8. insert into t5 values(1)(2); #正常
  9. """
  10. 2. 它除了有约束效果之外,它还是innodb存储引擎组织数据的依据
  11. innodb存储引擎在创建表的时候必须要有primary key
  12. 因为它类似于书的目录, 能够帮助提示查询效率并且也是建表的依据
  13. """
  14. #(1) 一张表中有且只有一个主键, 如果你没有设置主键,那么会从上往下搜索知道遇到一个非空且唯一的字段,它将自动升级为主键
  15. create table t6(
  16. id int,
  17. name char(16),
  18. age int not null unique,
  19. addr char(32) not null unique
  20. );
  21. #(2) 如果表中没有主键,也没有其他任何的非空唯一字段,那么innodb会采用自己内部提供的一个隐藏的字段作为主键;隐藏意味着无法使用到它,就无法提升查询速度
  22. #(3) 一张表中通常都应该有一个主键字段, 并且通常将id(uid/sid)字段作为主键
  23. create table t5(
  24. id int primary key
  25. name char(16)
  26. );
  27. #联合主键(多个字段联合起来作为表的主键,本质还是一个主键)
  28. create table t6(
  29. ip char(16),
  30. port int,
  31. primary key(ip,port)
  32. );
  33. """
  34. 也就意味着 以后在创建表的时候,id字段一定要加primary key
  35. """

auto_increment 自增

  1. #当编号特别多的时候,人为的去维护太麻烦
  2. create table t8(
  3. id int primary key auto_increment,
  4. name char(16)
  5. );
  6. insert into t8(name) values('jason'),('egon'),('kevin');
  7. #注意auto_increment 通常都是加在主键上的,不能给普通字段加

结论

  1. """
  2. 以后再创建表的id(数据的唯一标识id/uid/sid)字段的时候
  3. id int primary key auto_increment
  4. """

补充

  1. delete from 指令 在删除表中数据的时候,主键的自增不会停止
  2. truncate t1 #清空t1表数据并且重置主键

表之间建关系

外键

  1. #用来帮助我们建立表与表之间关系的
  2. foregin key

表关系

  1. """
  2. 表与表之间最多只有四种关系
  3. 一对多关系
  4. 一对一关系
  5. 多对多关系
  6. 没有关系
  7. """

一对多关系
  1. foreign key
  2. 1. 一对多表关系,外键字段建在'一对多'中的'多'一方
  3. 2. 在创建表的时候,一定要先建被关联表
  4. 3. 在录入数据的时候,也必须先录入被关联表
  5. #建部门表
  6. create table dep(
  7. id int primary key auto_increment,
  8. dep_name char(16),
  9. dep_desc char(32)
  10. );
  11. #建立员工表
  12. create table emp(
  13. id int primary key auto_increment,
  14. name char(16),
  15. gender enum('male','female','others') default 'male',
  16. dep_id int
  17. foreign key(dep_id) references dep(id) #解释:dep_id是外键,跟dep表的id字段关联
  18. on update cascade #同步更新
  19. on delete cascade #同步删除
  20. );
  21. #插入数据
  22. insert into dep(dep_name,dep_desc) values('sb教学部''教书育人'),('外交部','多人外交'),('nb技术部','技术能力有限部门');
  23. insert into emp(name,dep_id) values('jason',2),('egon','1'),('tank','1'),('kevin',3);
  24. #修改emp表中的dep_id或者dep表中的id
  25. update dep set id=200 where id=2; #不行
  26. #删除dep表里面的数据
  27. delete from dep #不行
  28. #修改方式1:先删除教学部对应的员工数据,之后再删除部门
  29. 操作太过繁琐
  30. #修改方式2:真正做到数据之间有关系
  31. 更新就同步更新,删除就同步删除
  32. """
  33. 级联更新
  34. on update cascade #同步更新
  35. 级联删除
  36. on delete cascade #同步删除
  37. """

多对多关系
  1. #新建图书表
  2. create table book(
  3. id int primary key auto_increment,
  4. title varchar(32), #标题
  5. price int, #价格
  6. """
  7. author_id int,
  8. foreign key(author_id) references author(id) #设置外键
  9. on update cascade
  10. on delete cascade
  11. """
  12. );
  13. #建立作者表
  14. create table author(
  15. id int primary key auto_increment,
  16. name varchar(32),
  17. age int, #年龄
  18. """
  19. book_id int,
  20. foreign key(book_id) references book(id) #设置外键
  21. on update cascade
  22. on delete cascade
  23. """
  24. );
  25. """
  26. 按照上述方式直接创建,两张表都不能成功
  27. 针对多对多字段关系 不能在两张原有的表中创建外键
  28. 需要单独再开设一张表,专门用来存储两张表数据之间的关系
  29. """
  30. #建立中间表
  31. create table book2author(
  32. id int priamary key auto_increment,
  33. book_id int,
  34. author_id int
  35. foreign key(book_id) references book(id)
  36. on update cascade
  37. on delete cascade,
  38. foreign key(author_id) references author(id) #设置外键
  39. on update cascade #同步更新
  40. on delete cascade #同步删除
  41. );

一对一关系
  1. """
  2. 如果一个表的字段特别多,每次查询又不是所有的字段都能用得到
  3. 将表一分为二
  4. 用户表
  5. 用户表 id name age
  6. 用户详情表 id addr phone email。。。。
  7. """
  8. 一对一外键建在任意一方都可以,但建议建在查询频率较高的表中
  9. #新建作者详细信息表
  10. create table authordetail(
  11. id int primary key auto_increment,
  12. phone int,
  13. addr char(32)
  14. );
  15. #建立作者比表
  16. create table author(
  17. id int primary key auto_increment,
  18. name varchar(32),
  19. age int,
  20. authordetail_id int unique, #详细表id列,设置'唯一'约束条件
  21. foreign key(authordetail_id) references authordetail(id)
  22. on update cascade
  23. on delete cascade
  24. );

修改表

  1. #mysql对大小写不敏感
  2. 1.修改表名
  3. alter table 表名 rename 新表名;
  4. 2.增加字段
  5. alter table 表名 add 字段名 字段类型(宽度) 约束条件;
  6. alter table 表名 add 字段名 字段类型(宽度) 约束条件 first
  7. alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
  8. 3.删除字段
  9. alter table 表名 drop 字段名;
  10. 4.修改字段
  11. #修改字段类型
  12. alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
  13. #修改字段名称
  14. alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;

复制表

  1. """
  2. 我们sql语句查询的结果其实也是一张虚拟表
  3. """
  4. create table 新表名 select * from 旧表; #只能复制数据,不能复制主键、外键等key
  5. 例:
  6. create table new——dep2 select * from dep where id>3;