首页 > 数据库 >MySQL数据库——字段约束条件

MySQL数据库——字段约束条件

时间:2022-11-24 18:45:07浏览次数:46  
标签:约束条件 varchar int 数据库 key MySQL table create id

MySQL数据库——字段约束条件

一、无符号、零填充

1、unsigned(无符号)
	id int unsigned
2、zerofill
	id int(5) zerofill

二、非空

'''
设置非空 not null  
所有字段类型在不加约束条件的情况下默认都可以为空
'''
create table t1(
	id int,
    name varchar(16) not null
);
insert into t1(id) values(1);
insert into t1(name) values('maria');
insert into t1(name,id) values('ben',2);

三、默认值

create table t2(
	id int default 888,
    name varchar(16) default '匿名'
);
insert into t2(id) values(1);
insert into t2(name) values('maria');
insert into t2 values(2,'ben');

四、唯一值

'''
单列唯一
'''
create table t3(
	id int unique,
    name varchar(32) unique
);
insert into t3 values(1,'maria'),(2,'ben');

'''
联合唯一
'''
create table t4(
	id int,
    ip varchar(32),
    port int,
    unique(ip,port)
)
insert into t4 values(1,'127.0.0.1',8080),
(2,'127.0.0.2',8080),(3,'127.0.0.1',8080);
insert into t4 values(4,'127.0.0.1',8080);

五、主键

'''
单从约束层面上而言,主键相当于not null + unique(非空且唯一)
'''

create table t5(
	id int primary key,
    name varchar(32)
);
insert into t5(name) values('maria');
insert into t5 values(1,'ben');
insert into t5 values(1.'david');
'''
	InnoDB存储引擎规定了所有的表都必须有且只有一个主键(主键是组织数据的重要条件,并且主键可以加快数据的查询速度)
	当表中没有主键也没有其他非空且唯一的字段是:
	InnoDB会采用一个隐藏的字段作为表的主键,这个主键无法使用,查询数据时会基于该表的数据一行行的查询,速度很慢
	当表中没有主键但是又其他非空且唯一的字段,那么会从上而下将第一个该字段自动升级为主键
'''
create table t6(
	id int,
    age int not null unique,
    phone bigint not null unique,
    birth int not null unique,
    height int not null unique
);
'''
我们在创建表的时候,应该有一个字段用来表示数据的唯一性,并且该字段通常情况下就是‘id’编号字段
'''
create table user_info(
	uid int primary key,
);

六、自增

'''
	该约束条件不能单独出现,并且一张表中只能出现一次,主要就是配合主键一起使用
'''
create table t7(
	id int primary key,
    name varchar(32)
);

create table t8(
	id int primary key auto_increment,
    name varchar(32)
);
'''
自增的特性:
	自增不会因为数据的删除而回退,而是接着之前的数值继续自增,如果设置了更大的数,则按照最大的那个数继续自增
	如果想要充值某张表的主键值,可以使用关键字
	truncate 表名;
	清空表数据并重置主键
'''
truncate t7;

七、外键

1、外键前戏

'''
为什么需要外键:
	如果所有的数据都在同一个表内:
	1、表名的语义不明确
	2、存取数据过于冗余
	3、数据的拓展性极差
使用将一张大表拆分为两个或多个表,并用外键连接,即可避免上述问题

外键:
	用于表示表内数据与数据之间的关系
'''

2、关系的判断

'''
表关系:
	一对多
	多对多
	一对一
	无关系
'''

2.1一对多关系

'''
以员工表和部门表为例
	1.先站在员工表的角度
    	问:一名员工能否对应多个部门
       答:不可以
 	2.再站在部门表的角度
    	问:一个部门能否对应多名员工
     	答:可以	
	结论:一个可以一个不可以 那么关系就是'一对多'
	针对'一对多'关系 外键字段建在'多'的一方

小技巧:
	先定义出含有普通字段的表 之后再考虑外键字段的添加
'''
create table emp(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id)
);

create table dep(
	id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(64)
);
'''
1、创建表的时候一定要先创建被关联表
2、录入表数据的是偶一定要先录入被关联表
3、修改数据的时候外键字段无法修改和删除
针对3有简化措施>>>:级联更新、级联删除
'''
create table emp1(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    dep_id int,
    foreign key(dep_id) references dep2(id)
    on update cascade
    on delete cascade
);
create table dep1(
	id int primary key auto_increment,
    dep_name varchar(32),
    dep_dasc varchar(64)
);
'''
外键是强耦合,不符合戒耦合的特性
所以很多时候 实际项目中当表较多的情况 
我们可能不会使用外键 
而是使用代码建立逻辑层面的关系
'''

2.2 多对多关系

 '''
 以书籍表与作者表为例
	1.先站在书籍表的角度
  		问:一本书能否对应多个作者
      答:可以
 	2.再站在作者表的角度
    	问:一个作者能否对应多本书
      	答:可以
   结论:两个都可以 关系就是'多对多'	
 	针对'多对多'不能在表中直接创建 需要新建第三张关系表
 '''
 create table book(
 	id int primary key auto_increment,
     title varchar(32),
     price float(5,2)
 );
 create table author(
 	id int primary key auto_increment,
     name varchar(32),
     phone bigint
 );
 create table book_author(
 	id int primary key auto_increment,
     author_id int,
     foreign key(author_id) references author(id)
     on update cascade
     on delete cascade,
     book_id int,
     foreign key(book_id) references book(id)
     on update cascade
     on delete cascade
 );

2.3 一对一关系

'''
以用户表与用户详情表为例
	1.先站在用户表的角度
  		问:一个用户能否对应多个用户详情
      答:不可以
 	2.再站在用户详情表的角度
    	问:一个用户详情能否对应多个用户
      	答:不可以
   结论:两个都可以 关系就是'一对一'或者没有关系	
 	针对'一对一'外键字段建在任何一方都可以 但是推荐建在查询频率较高的表中
'''
create table user(
	id int primary key auto_increment,
    name varchar(32),
    detail_id in unique,
    foreign key(detail_id) references user_detail(id)
    on update cascade
    on delete cascade
);

create table user_detail(
	id int primary key auto_increment,
    phone bigint
);

标签:约束条件,varchar,int,数据库,key,MySQL,table,create,id
From: https://www.cnblogs.com/HaiMan/p/16922843.html

相关文章

  • mysql忘记密码(Navicat)
    Navicat已经成功连接,密码忘记的解决方法。本文属于转载,转载地址:https://blog.csdn.net/zcxbd/article/details/122876238背景:Windows环境办法:通过注册表查找......
  • mysql update set where用法
    UPDATEuser_base_infouiSETavatar=(SELECTimgurlFROMalbumaWHEREa.userId=ui.userIdANDa.iscoverImg=1)......
  • idea使用groovy脚本自动生成数据库实体
    importcom.intellij.database.model.DasTableimportcom.intellij.database.util.Caseimportcom.intellij.database.util.DasUtilimportjava.time.LocalDateimportjava.......
  • mysql批量select插入
    基本用法如下INSERTINTOsg_questions_category(qid,categoryId)SELECTqid,6FROM`sg_questions`MySQL当记录不存在时插入(insertifnotexists)有两种方法:示例一:插入多......
  • python之路35 MySQL 3 字段的约束条件
    字段约束条件无符号、零填充unsignedidintunsignedzerofillidint(5)zerofill非空createtablet1(idint,namevarchar(16));insert......
  • mysql升序排列id为0的在最后
    在实际开发中有时会有升序排列id为0的在最后的需求,这里我记录了一种在stackoverflow中比较简单的方法如下:Youmaywanttotrythefollowing:SELECT*FROMyour_tableOR......
  • 解决mysql的in条件中参数是带引号的字符串的时候查询失效
    在开发中有时会使用到in查询,并且里面的参数又是数据库中的一个字段,比如如下错误的例子SELECT`ag`.`id`,`ag`.`rules`,(SELECTGROUP_CONCA......
  • mysql索引和性能优化
    使用索引的原则1.如果没有唯一性要求,可以选择普通索引2.如果列上有唯一性要求,可以选择唯一索引3.如果是需要模糊搜索,建议选择全文索引4.如果有多个条件一起查......
  • MySQL 查询
    createTABLEstudent(idintnotnullDEFAULT1,nameVARCHAR(20)notnullDEFAULT'',chineseFLOATnotnullDEFAULT0.0,englishFLOATnotnullDEFAULT0.0,math......
  • 字段约束条件之非空、默认值、唯一值、主键、自增、外键
    目录字段约束条件无符号、零填充非空默认值唯一值主键自增外键前戏关系的判断一对多关系外键字段的建立多对多关系一对一关系字段约束条件无符号、零填充unsigned idi......