数据约束条件

打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

MySQL字段约束条件


  • 无符号, 零填充
  • 非空
  • 默认值
  • 唯一值
  • 主键
  • 自增
  • 外键
  • 无符号,零填充
无符号,忽略数据中的正负符号关键字unsigned
零填充,数据未到数据位的情况下使用零填充
  1. 1. 验证零填充,查看数据345是否会被零填充
  2. mysql> create table t1(id int unsigned, uid int(5) zerofill);
  3. Query OK, 0 rows affected (0.05 sec)
  4. mysql> insert into t1 values(123, 345);
  5. Query OK, 1 row affected (0.02 sec)
  6. mysql> select * from t1;
  7. +-----+-------+
  8. | id  | uid   |
  9. +-----+-------+
  10. | 123 | 00345 |
  11. +-----+-------+
  12. 1 row in set (0.02 sec)
  13. mysql>
复制代码

  • 非空 not null
MySQL数据库在不加约束条件的情况下字段的值是可以为空的
  1. 1. 验证MySQL数据值默认情况下是否可以为空
  2. mysql> create table t2(id int, name varchar(16));
  3. Query OK, 0 rows affected (0.05 sec)
  4. mysql> insert into t2(name) values('li');
  5. Query OK, 1 row affected (0.03 sec)
  6. mysql> select * from t2;
  7. +------+------+
  8. | id   | name |
  9. +------+------+
  10. | NULL | li   |
  11. +------+------+
  12. # 这里如果id不写数据则直接为NULL
  13. 1 row in set (0.02 sec)
  14. 2. 验证MySQL添加约束条件后,是否可以继续为空
  15. mysql> create table t3(id int not null, name varchar(16) not null);
  16. Query OK, 0 rows affected (0.07 sec)
  17. # 这里如果插入为空则直接报错
  18. mysql> insert into t3(name) values('jin');
  19. 1364 - Field 'id' doesn't have a default value
  20. # 必须需要插入设定不能为空的值
  21. mysql> insert into t3 values(1, 'jin');
  22. Query OK, 1 row affected (0.03 sec)
  23. mysql> select * from t3;
  24. +----+------+
  25. | id | name |
  26. +----+------+
  27. |  1 | jin  |
  28. +----+------+
  29. 1 row in set (0.02 sec)
复制代码

  • 默认值 default
默认值指的是这里会给一个默认的值,假如在insert数据时无数据则按照默认值显示
  1. mysql> create table t4(id int, name varchar(16), gender varchar(16) default 'male' );
  2. Query OK, 0 rows affected (0.06 sec)
  3. mysql> insert into t4(id,name) values(1,'wesley');
  4. Query OK, 1 row affected (0.03 sec)
  5. mysql> select * from t4;
  6. +----+--------+--------+
  7. | id | name   | gender |
  8. +----+--------+--------+
  9. |  1 | wesley | male   |
  10. +----+--------+--------+
  11. 1 row in set (0.02 sec)
  12. mysql>
复制代码

  • 唯一值 unique
即每列数值只能存储一次,相对于列数据来说是唯一
  1. mysql> create table t5(id int unique, name varchar(16) unique);
  2. Query OK, 0 rows affected (0.05 sec)
  3. mysql> insert into t5 values(1,'wesley');
  4. Query OK, 1 row affected (0.02 sec)
  5. # 这里可以看到对使用了unique的列数据无法从新insert
  6. mysql> insert into t5 values(2, 'wesley');
  7. 1062 - Duplicate entry 'wesley' for key 'name'
  8. mysql> select * from t5;
  9. +----+--------+
  10. | id | name   |
  11. +----+--------+
  12. |  1 | wesley |
  13. +----+--------+
  14. 1 row in set (0.02 sec)
  15. mysql>
复制代码

  • 主键 primary key
从约束层面上而言主键相当于not null + unique (非空且唯一)
  1. # 设定id字段为主键
  2. mysql> create table t6(id int primary key, name varchar(16));
  3. Query OK, 0 rows affected (0.04 sec)
  4. # insert 数据
  5. mysql> insert into t6 values(1, 'wesley');
  6. Query OK, 1 row affected (0.02 sec)
  7. # 想在主键位置从新insert数据后发现无法插入,这就是主键的唯一性
  8. mysql> insert into t6 values(1, 'andy');
  9. 1062 - Duplicate entry '1' for key 'PRIMARY'
  10. mysql> select * from t6;
  11. +----+--------+
  12. | id | name   |
  13. +----+--------+
  14. |  1 | wesley |
  15. +----+--------+
  16. 1 row in set (0.03 sec)
  17. mysql> show create table t6;
  18. ----------------------------------+
  19. | t6    | CREATE TABLE `t6` (
  20.   `id` int(11) NOT NULL,
  21.   `name` varchar(16) DEFAULT NULL,
  22.   PRIMARY KEY (`id`)
  23. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  24. """
  25. 上述通过对表结构的查看可以看到,PRIMARY KEY (`id`) 这是主键的标识
  26. """
  27. 2. InnoDB存储引擎规定了所有的表都必须且只有一个主键,主键是组织数据的重要条件并且可以数据的查询速度
  28.         2.1 当表中没有主键也没有其他非空且唯一的字段的情况下
  29.                         InnoDB会采用一个隐藏的字段作为表的主键,隐藏就意味着无法使用,对于该表的数据查询就只能遍历全表
  30.         2.2 当表中没有主键但是有非空且唯一的指端,那么会从上往下将第一个该字段升级为主键
  31.        
  32.         mysql> create table t7(
  33.         id int,
  34.         age int not null unique,
  35.         phone bigint not null unique
  36. );
  37. Query OK, 0 rows affected (0.05 sec)
  38. mysql> insert into t7 values(1, 18, 110),(2,19,120);
  39. Query OK, 2 rows affected (0.03 sec)
  40. Records: 2  Duplicates: 0  Warnings: 0
  41. mysql> select * from t7;
  42. +----+-----+-------+
  43. | id | age | phone |
  44. +----+-----+-------+
  45. |  1 |  18 |   110 |
  46. |  2 |  19 |   120 |
  47. +----+-----+-------+
  48. 2 rows in set (0.02 sec)
  49. # 使用desc查看可以看到Key的PRI对应的是age,age为第一个非空且唯一
  50. mysql> desc t7;
  51. +-------+------------+------+-----+---------+-------+
  52. | Field | Type       | Null | Key | Default | Extra |
  53. +-------+------------+------+-----+---------+-------+
  54. | id    | int(11)    | YES  |     | NULL    |       |
  55. | age   | int(11)    | NO   | PRI | NULL    |       |
  56. | phone | bigint(20) | NO   | UNI | NULL    |       |
  57. +-------+------------+------+-----+---------+-------+
  58. 3 rows in set (0.02 sec)
  59. """
  60. 1. 一般主键字段名称都是为*id
  61. """
复制代码

  • 自增 auto_increment
该约束条件并不能单独出现,并且一张表内只能出现一次,主要是配合主键一起使用
  1. """
  2. auto_increment的特性
  3. 1. 自增不会应为数据的删除而回退,永远向前
  4. 2. 如果在写入数据时设定了更大的值,则之后按照更大的值向前自增
  5. 3. 如果需要重置某一张表的主键值,可以使用truncate tablename;
  6. 4. 请注意:truncate tablename; 作用是清除表数据并重置主键
  7. """
  8. # 创建t9并将id作为自增主键
  9. mysql> create table t9(
  10.         id int primary key auto_increment,
  11.         name varchar(16)
  12. );
  13. Query OK, 0 rows affected (0.06 sec)
  14. # 反复插入数据,不需要指定主键
  15. mysql> insert into t9(name) values('li'),('jin'),('ke');
  16.        
  17. Query OK, 3 rows affected (0.02 sec)
  18. Records: 3  Duplicates: 0  Warnings: 0
  19. mysql> insert into t9(name) values('li'),('jin'),('ke');
  20.        
  21. Query OK, 3 rows affected (0.02 sec)
  22. Records: 3  Duplicates: 0  Warnings: 0
  23. mysql> insert into t9(name) values('li'),('jin'),('ke');
  24.        
  25. Query OK, 3 rows affected (0.03 sec)
  26. Records: 3  Duplicates: 0  Warnings: 0
  27. # 结果为主键从1开始向后自增
  28. mysql> select * from t9;
  29. +----+------+
  30. | id | name |
  31. +----+------+
  32. |  1 | li   |
  33. |  2 | jin  |
  34. |  3 | ke   |
  35. |  4 | li   |
  36. |  5 | jin  |
  37. |  6 | ke   |
  38. |  7 | li   |
  39. |  8 | jin  |
  40. |  9 | ke   |
  41. +----+------+
  42. 9 rows in set (0.02 sec)
复制代码

  • 外键
表与表的关系建立一样平常是通过外键建立,用于标识表字段数据之间的关系


  • 关系判断
在外键的关系判断中,一共有4种
一对多
多对多
一对一
没有关系

  • 一对多关系
    员工角度:
    一个员工不可以对应多个部门
    部门角度:
    一个部门可以对应多个员工
结论:一个可以一个不可以,关系就是一对多,针对一对多关系,外键字段建在多的一方

  • 外键字段的建立
先定义含有平凡字段的表,然后再思量外键字段的添加
简化版
  1. # 员工表
  2. create table emp(
  3.         id int primary key auto_increment,
  4.         name varchar(32),
  5.         age int,
  6.         dep_id int,
  7.         foreign key(dep_id) references dep(id)
  8. );
  9. # 部门表
  10. create table dep(
  11.         id int primary key auto_increment,
  12.         dep_name varchar(32),
  13.         dep_desc varchar(64)
  14. );
  15. 1. 创建表的时候,被关联表一定需要先创建,否则找不到关联字段
  16. 2. 录入数据时需要先录入被关联表的信息,否则找不到关联信息
  17. 3. 修改数据的时候外键字段无法修改和删除
复制代码
级联版
级联就是可以将数据绑定,删除数据对应的关系数据也会被删除
  1. create table dmp1(
  2.         id int primary key auto_increment,
  3.         name varchar(32),
  4.         age int,
  5.         dep_id int,
  6.         foreign key(dep_id) references dep1(id)
  7.         on update cascade
  8.         on delete cascade
  9. );
  10. create table dep1(
  11.         id int primary key auto_increment,
  12.         dep_name varchar(32),
  13.         dep_desc varchar(64)
  14. );
  15. insert into dep1(dep_name,dep_desc) values('dev','dev apply'),('ops','ops');
  16. insert into dmp1(name, age, dep_id) values('wesley',18,1),('andy', 44, 2);
  17. # 查询表数据
  18. mysql> select * from dep1;
  19. +----+----------+-----------+
  20. | id | dep_name | dep_desc  |
  21. +----+----------+-----------+
  22. |  1 | dev      | dev apply |
  23. |  2 | ops      | ops       |
  24. +----+----------+-----------+
  25. 2 rows in set (0.02 sec)
  26. mysql> select * from dmp1;
  27. +----+--------+-----+--------+
  28. | id | name   | age | dep_id |
  29. +----+--------+-----+--------+
  30. |  1 | wesley |  18 |      1 |
  31. |  2 | andy   |  44 |      2 |
  32. +----+--------+-----+--------+
  33. 2 rows in set (0.02 sec)
  34. # 删除dep1表id为1的记录,同时观察表编号
  35. mysql> delete from dep1 where id = 1;
  36. Query OK, 1 row affected (0.02 sec)
  37. mysql> select * from dep1;
  38. +----+----------+----------+
  39. | id | dep_name | dep_desc |
  40. +----+----------+----------+
  41. |  2 | ops      | ops      |
  42. +----+----------+----------+
  43. 1 row in set (0.02 sec)
  44. mysql> select * from dmp1;
  45. +----+------+-----+--------+
  46. | id | name | age | dep_id |
  47. +----+------+-----+--------+
  48. |  2 | andy |  44 |      2 |
  49. +----+------+-----+--------+
  50. 1 row in set (0.02 sec)
  51. """
  52. 上述可以发现当使用级联后,删除表里的关系数据后,其他相关表里的数据也会被删除
  53. 需要注意:外键是数据间的强耦合
  54. """
复制代码

  • 多对多关系
    以册本表与作者表为例

  • 册本表
    一本书是否可以拥有多个作者,可以
  • 作者表
    一个作者是否可以对应多本书,可以
结论: 两者都可以,关系就是多对多,针对多对多不能直接在表中创建,需要创建第三张表来生存对应关系
[code]# 创建册本表
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表