MYSQL 字段约束条件()

字段的约束条件

创建表:
    create table t19(id int,name varchar(32));
往表中添加数据:
    insert into t19(name,id) values('tom',1);    # 可以自定义字段顺序
    insert into t19 values(2,'ami');
查看表数据:
    select * from t19;

# 1.无负号unsigned
         create table t20(id int unsigned,name varchar(32));
# 2.零填充zerofill
         create table t20(id int zerofill,name varchar(32));
# 3.非空not null
         create table t20(id int,name varchar(32) not null);
               # 所有字段类型不加约束条件的情况下默认都可以为空
# 4.默认值default
         create table t20(id int,name varchar(32) default 'jason');
# 5.唯一值unique
         # 单列唯一  : 使用后所在的字段名数据不能重复
         create table t20(id int unique,name varchar(32));
         # 联合唯一  使用后组合后的数据不能重复
         create table t20(id int,name varchar(32) default 'jason');               

主键

# 1.主键设置   primary key
        create table t1(id int primary key,name varchar(32));
        # -1. 单从约束层面上而言主键相当于not null + unique(非空且唯一)
        # -2. InnoDB引擎规定一张表只能有一个主键
               - 1.如果创建的表没有设置主键,非空且唯一的字段会被默认设为主键,                   非空且唯一的的字段也没有,InnoDB会将隐藏的字段作为主键
                        id int not null unique
               - 2.主键可以加快数据查询
               - 3.创建表的时候都需要有id字段,并且id字段应设为主键
               - 4.单列主键           id int primary key
               - 5.联合主键           id1 int,id2 int,primary key(id1,id2)     

# 2.主键自增 auto_increment
        # -1.主键的自增作为约束条件要跟在键的后面,无法单独使用
               create table t(id int primary key auto_increment,name varchar(32));
        # -2.特点:在删除数据时,自增操作不会回退与重置,要想重置主键,需要对表格式化
               truncate 表名;   # # 删除表数据并重置主键值  

外键

# 1.外键用于记录表与表之间的数据关系
      数据的关系有四种:
           1. 一对一的关系
           2. 一对多的关系
           3. 多对多的关系
           4. 没有关系
    """对于表关系如何判定呢: 换位思考他们的关系几对几"""

# 2.外键的创建位置
      1. 针对'一对多'的关系,外键字段建在多的一方 
      2. 针对'多对多'的关系,外键需要开设第三张关系表存储数据关系
      3. 针对'一对一'的关系,外键可以建在任何一方,但是一般选择建在查询频率较高的表

# 3.外键设置的关键字: foreign key
      - 必须基于多张表关系才可以设置表关系

        create table t4(            id int primary key auto_increment,            name varchar(32),            t5_id int,            foreign key(t5_id) references t5(id));       

        create table t5(            id int primary key auto_increment,            t5_name varchar(32),            t5_desc varchar(64));

表关系创建

# 1.一对多
   - 创建一对多的表关系数据
       1.先写普通字段
       2.然后再写外键字段   
          create table dep(
                id int primary key auto_increment,
                dep_name varchar(32),
                dep_desc varchar(32)
          );
          create table emp(
                id int primary key auto_increment,
                name varchar(32),
                gender enum('male','female','others') default 'male',
                dep_id int,
                foreign key(dep_id) references dep(id)
         );
操作可能出现的问题:
    1.创建表的时候需要先创建没有外键的表,然后是有外键的表
    2.插入表数据的时候,外键字段只能写关联表字段里的数据值
    3.被关联字段的操作限制性太强,无法进行修改与删除

如何解决:  使用级联更新,级联删除
    on update cascade  # 级联更新 
    on delete cascade   # 级联删除
    """被关联数据一旦变动,关联的数据同步变动"""
    create table emp1(
          id int primary key auto_increment,
          name varchar(32),
          gender enum('male','female','others') default 'male',
                 dep_id int,
                 foreign key(dep_id) references dep1(id) 
                 on update cascade  
                 on delete cascade  
    ); 
    create table dep1(
          id int primary key auto_increment,
          dep_name varchar(32),
          dep_desc varchar(32)
    );

"""
- 在实际工作中,很多时候可能并不会使用外键
      因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
- 我们为了能够描述出表数据的关系,又不想使用外键
      自己通过写SQL,建立代码层面的关系
"""



# 2.多对多
   - 创建多对多的表关系数据
     * 不能直接创建,需要单独开设第三张关系表。存储数据关系
         create table book(
               id int primary key auto_increment,
               title varchar(32)
         );
        create table author(
              id int primary key auto_increment,
              name varchar(32)
        );
        create table bookauthor(
              id int primary key auto_increment,
              book_id int,
              foreign key(book_id) references book(id) 
              on update cascade  # 级联更新 
              on delete cascade, # 级联删除
              author_id int,
              foreign key(author_id) references author(id) 
              on update cascade  # 级联更新 
              on delete cascade  # 级联删除
        );



# 3.一对一
   - 创建一对一的表关系数据
          create table userDetail(
                id int primary key auto_increment,
                phone bigint
          );
          create table user(
                id int primary key auto_increment,
                name varchar(32),
                detail_id int unique,
                foreign key(detail_id) references userDetail(id) 
                on update cascade  
                on delete cascade  
          );

# 4.没有关系
————————

字段的约束条件

创建表:
    create table t19(id int,name varchar(32));
往表中添加数据:
    insert into t19(name,id) values('tom',1);    # 可以自定义字段顺序
    insert into t19 values(2,'ami');
查看表数据:
    select * from t19;

# 1.无负号unsigned
         create table t20(id int unsigned,name varchar(32));
# 2.零填充zerofill
         create table t20(id int zerofill,name varchar(32));
# 3.非空not null
         create table t20(id int,name varchar(32) not null);
               # 所有字段类型不加约束条件的情况下默认都可以为空
# 4.默认值default
         create table t20(id int,name varchar(32) default 'jason');
# 5.唯一值unique
         # 单列唯一  : 使用后所在的字段名数据不能重复
         create table t20(id int unique,name varchar(32));
         # 联合唯一  使用后组合后的数据不能重复
         create table t20(id int,name varchar(32) default 'jason');               

主键

# 1.主键设置   primary key
        create table t1(id int primary key,name varchar(32));
        # -1. 单从约束层面上而言主键相当于not null + unique(非空且唯一)
        # -2. InnoDB引擎规定一张表只能有一个主键
               - 1.如果创建的表没有设置主键,非空且唯一的字段会被默认设为主键,                   非空且唯一的的字段也没有,InnoDB会将隐藏的字段作为主键
                        id int not null unique
               - 2.主键可以加快数据查询
               - 3.创建表的时候都需要有id字段,并且id字段应设为主键
               - 4.单列主键           id int primary key
               - 5.联合主键           id1 int,id2 int,primary key(id1,id2)     

# 2.主键自增 auto_increment
        # -1.主键的自增作为约束条件要跟在键的后面,无法单独使用
               create table t(id int primary key auto_increment,name varchar(32));
        # -2.特点:在删除数据时,自增操作不会回退与重置,要想重置主键,需要对表格式化
               truncate 表名;   # # 删除表数据并重置主键值  

外键

# 1.外键用于记录表与表之间的数据关系
      数据的关系有四种:
           1. 一对一的关系
           2. 一对多的关系
           3. 多对多的关系
           4. 没有关系
    """对于表关系如何判定呢: 换位思考他们的关系几对几"""

# 2.外键的创建位置
      1. 针对'一对多'的关系,外键字段建在多的一方 
      2. 针对'多对多'的关系,外键需要开设第三张关系表存储数据关系
      3. 针对'一对一'的关系,外键可以建在任何一方,但是一般选择建在查询频率较高的表

# 3.外键设置的关键字: foreign key
      - 必须基于多张表关系才可以设置表关系

        create table t4(            id int primary key auto_increment,            name varchar(32),            t5_id int,            foreign key(t5_id) references t5(id));       

        create table t5(            id int primary key auto_increment,            t5_name varchar(32),            t5_desc varchar(64));

表关系创建

# 1.一对多
   - 创建一对多的表关系数据
       1.先写普通字段
       2.然后再写外键字段   
          create table dep(
                id int primary key auto_increment,
                dep_name varchar(32),
                dep_desc varchar(32)
          );
          create table emp(
                id int primary key auto_increment,
                name varchar(32),
                gender enum('male','female','others') default 'male',
                dep_id int,
                foreign key(dep_id) references dep(id)
         );
操作可能出现的问题:
    1.创建表的时候需要先创建没有外键的表,然后是有外键的表
    2.插入表数据的时候,外键字段只能写关联表字段里的数据值
    3.被关联字段的操作限制性太强,无法进行修改与删除

如何解决:  使用级联更新,级联删除
    on update cascade  # 级联更新 
    on delete cascade   # 级联删除
    """被关联数据一旦变动,关联的数据同步变动"""
    create table emp1(
          id int primary key auto_increment,
          name varchar(32),
          gender enum('male','female','others') default 'male',
                 dep_id int,
                 foreign key(dep_id) references dep1(id) 
                 on update cascade  
                 on delete cascade  
    ); 
    create table dep1(
          id int primary key auto_increment,
          dep_name varchar(32),
          dep_desc varchar(32)
    );

"""
- 在实际工作中,很多时候可能并不会使用外键
      因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
- 我们为了能够描述出表数据的关系,又不想使用外键
      自己通过写SQL,建立代码层面的关系
"""



# 2.多对多
   - 创建多对多的表关系数据
     * 不能直接创建,需要单独开设第三张关系表。存储数据关系
         create table book(
               id int primary key auto_increment,
               title varchar(32)
         );
        create table author(
              id int primary key auto_increment,
              name varchar(32)
        );
        create table bookauthor(
              id int primary key auto_increment,
              book_id int,
              foreign key(book_id) references book(id) 
              on update cascade  # 级联更新 
              on delete cascade, # 级联删除
              author_id int,
              foreign key(author_id) references author(id) 
              on update cascade  # 级联更新 
              on delete cascade  # 级联删除
        );



# 3.一对一
   - 创建一对一的表关系数据
          create table userDetail(
                id int primary key auto_increment,
                phone bigint
          );
          create table user(
                id int primary key auto_increment,
                name varchar(32),
                detail_id int unique,
                foreign key(detail_id) references userDetail(id) 
                on update cascade  
                on delete cascade  
          );

# 4.没有关系