首页 > 数据库 >MySQL之约束条件

MySQL之约束条件

时间:2024-03-03 17:44:22浏览次数:36  
标签:约束条件 name int id key MySQL table 主键

表完整性约束

介绍:约束条件与数据类型的宽度一样,都是可选参数

作用:用于保证数据的完整性和一致性

主要分为:

DEFAULT    为该字段设置默认值
NOT NULL    标识该字段不能为空
UNIQUE KEY (UK)    标识该字段的值是唯一的
AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK)    标识该字段为该表的外键

UNSIGNED 无符号
ZEROFILL 使用0填充

not null 非空

是否可空,null表示空,非字符串 not null - 不可空 null - 可空

示例:

create table t0(id int); #id字段默认可以插入空
desc t0;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
insert into t0 values(); #可以插入空


create table t0_0(id int not null); #设置字段id不为空
desc t0_0;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
insert into t0_0 values(); #不能插入空
ERROR 1364 (HY000): Field 'id' doesn't have a default value

default默认值

默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值 create table tb1( nid int not null defalut 2, num int not null )

注意:设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值。

示例:

create table t1(
	id int,
    name char(16)
);
desc t1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
insert into t1(name,id) values ('xiao',1);
select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | xiao |
+------+------+

# 默认值使用
create table t2(
	id int,
    name char(16),
    gender enum('male','female','others') default 'male'
);
desc t2;
+--------+--------------------------------+------+-----+---------+-------+
| Field  | Type                           | Null | Key | Default | Extra |
+--------+--------------------------------+------+-----+---------+-------+
| id     | int(11)                        | YES  |     | NULL    |       |
| name   | char(16)                       | YES  |     | NULL    |       |
| gender | enum('male','female','others') | YES  |     | male    |       |
+--------+--------------------------------+------+-----+---------+-------+

insert into t2(id,name) values(1,'xiao');
insert into t2 values(2,'quan','female');
 select * from t2;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | xiao | male   |
|    2 | quan | female |
+------+------+--------+

unique唯一

# 单列唯一
create table t3(
	id int unique,
    name char(16)
);
desc t3;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  | UNI | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
insert into t3 values(1,'xiao'),(1,'quan');
# ERROR 1062 (23000): Duplicate entry '1' for key 'id'
insert into t3 values(1,'xiao'),(2,'quan');
 select * from t3;
+------+------+
| id   | name |
+------+------+
|    1 | xiao |
|    2 | quan |
+------+------+

# 联合唯一
ip 和 port
单个都可以重复,但是加在一起必须是唯一的

create table t4(
	id int,
    ip char(16),
    port int,
    unique(ip,port)
);

insert into t4 value(1,'127.0.0.1',8080);
insert into t4 value(2,'127.0.0.1',8081);
insert into t4 value(3,'127.0.0.2',8080);
 select * from t4;
+------+-----------+------+
| id   | ip        | port |
+------+-----------+------+
|    1 | 127.0.0.1 | 8080 |
|    2 | 127.0.0.1 | 8081 |
|    3 | 127.0.0.2 | 8080 |
+------+-----------+------+
insert into t4 value(4,'127.0.0.1',8080);
# ERROR 1062 (23000): Duplicate entry '127.0.0.1-8080' for key 'ip'

not null+unique组合使用

create table t1(id int not null unique);

desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+

primary key主键

从约束角度看primary key字段的值不为空且唯一,那我们直接使用not null+unique不就可以了吗,要它干什么?

主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,一张表中必须有且只有一个主键。

1. 单单从约束效果上来看primary key等价于not null + unique
非空且唯一!!!

create table t5(id int primary key);
desc t5;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
insert into t5 values(null);
# ERROR 1048 (23000): Column 'id' cannot be null
insert into t5 values(1),(1);
# ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

2. 它除了有约束效果之外,它还是Innodb存储引擎组织数据的依据,Innodb存储引擎在创建表的时候必须要有primary key
因为它类似于书的目录,能够帮助提示查询效率并且也是建表的依据

# 1.一张表中有且只有一个主键,如果你没有设置主键,那么会从上往下搜索直到遇到一个非空且唯一的字段将它自动升级为主键。
create table t6(
	id int,
    name char(16),
    age int not null unique,
    addr char(32) not null unique
);
desc t6;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
| age   | int(11)  | NO   | PRI | NULL    |       |
| addr  | char(32) | NO   | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+

# 2.如果表中没有主键也没有其他任何的非空且唯一字段,那么Innodb会采用自己内部提供的一个隐藏字段作为主键,隐藏意味着你无法使用到它,就无法提示查询速度。

# 3.一张表中通常都应该有一个主键字段,并且通常将id/uid/sid字段作为主键。
# 单个字段主键
create table t7(
	id int primary key,
    name char(16)
);

# 联合主键(多个字段联合起来作为表的主键,本质还是一个主键)
create table t8(
	ip char(16),
    port int,
    primary key(ip,port)
);
desc t8;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip    | char(16) | NO   | PRI | NULL    |       |
| port  | int(11)  | NO   | PRI | NULL    |       |
+-------+----------+------+-----+---------+-------+
本质上还是一个主键

总结:也就意味着,以后我们在创建表的时候id字段一定要加上primary key

auto_increment自增

约束字段为自动增长,被约束的字段必须同时被key约束

# 当编号特别多的时候,人为的去维护太麻烦
create table t9(
	id int primary key auto_increment,
    name char(16)
);
insert into t9(name) values('xiao'),('quan'),('zheng');
select * from t9;
+----+-------+
| id | name  |  id自增
+----+-------+
|  1 | xiao  |
|  2 | quan  |
|  3 | zheng |
+----+-------+

# 注意:auto_increment 通常都是加在主键上的,不能给普通字段加
create table t10(
	id int primary key auto_increment,
    name char(16),
    cid int auto_increment
);
# ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

# 结论:以后再创建表的id(数据的唯一标识id、uid、sid)字段的时候
	id int primary key auto_increment

补充

delete from 在删除表中数据的时候,主键的自增不会停止

truncate t1 清空表数据并重置主键
-- 语法
ALTER TABLE 表名 AUTO_INCREMENT = 1;
例子:再次修改自增键
ALTER TABLE t8 AUTO_INCREMENT = 1;

如何查看当前表的约束条件

  • 给约束条件添加名字
show databases;

image

use information_schema;

image

show tables;

image

desc table_constraints;
  • table_constraints 该表专门存储约束信息

image

  • 查看某张表存在哪些约束条件?
select constraint_name from table_constraints where table_name='表名';

外键

下一篇笔记详解外键

标签:约束条件,name,int,id,key,MySQL,table,主键
From: https://www.cnblogs.com/xiao01/p/18050362

相关文章

  • Linux安装Docker并搭建MySql、Redis、RabbitMQ
    1.1安装docker(1)删除老版本sudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......
  • MySQL之基本数据类型
    数据类型:类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMT......
  • Docker启动MySQL容器自动停止问题
    可能是mysql使用的内存过多,导致系统杀死了对应的进程mysql启动后设置限制内存在宿主机任意位置下:vimdocker.cnf写入:skip-host-cacheskip-name-resolveperformance_schema_max_table_instances=400table_definition_cache=400table_open_cache=256performance_......
  • MySQL安装
    下载mysql官网地址:https://dev.mysql.com/downloads/mysql/配置解压文件解压下载好的压缩文件解压后目录中可能没有my.ini文件,自己创建一个使用记事本打开my.ini文件[mysqld]port=3306basedir=C:\ProgramFiles\MySQLdatadir=C:\ProgramFiles\MySQL\Datamax......
  • 新电脑装编程配置(jdk、MySQL、navicat、idea、Maven、gitee、环境配置)
    一、JDK(java运行环境,不安装不能在自己电脑上运行java语言)1.打开安装包     2.选择安装目录(建议选择非系统盘)      3.安装JRE(最好和JDK分开文件夹、建议选择非系统盘)     4.提示安装成功     配置环境变量:JAVA......
  • MySQL之存储引擎
    什么是存储引擎数据库存储引擎是数据库底层软件组织,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据。日常生活中文件格式有很多种,并且针对不同的文件格式会有对应不同存储方式和处理机制(txt、pdf、word、mp4等等)不同的存储引擎提供不同的存储机制、索引机制......
  • MySQL之SQL语句+严格模式
    SQL使用规范在数据库管理系统中,SQL语句关键字不区分大小写(但建议用大写),参数区分大小写。建议命令大写,数据库名、数据表名、字段名统一小写,如数据库名、数据表名、字段名与关键字同名,使用反引号圈起来,避免冲突。SQL语句可单行或多行书写,默认以英文分号(;)结尾,关键词不能跨多......
  • MySQL之初识数据库
    linux安装更新YUM源:sudorpm-Uvhhttps://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm安装MySQL:sudoyum-yinstallmysql-community-server--enablerepo=mysql80-community--nogpgcheck启动数据库netstartmysql或者sudosystemctlstartmysq......
  • MySQL之MySQL数据库安装
    了解各种服务器的端口MySQL:3306Redis:6379MongoDB:27017Django:8000flask:5000MySQL介绍MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下公司。MySQL最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDa......
  • PostgreSQL初体验及其与MySQL的对比
    因为工作的原因接触到了pgsql数据库,对PostgreSQL的体系和运维操作也有了一定的了解。PostgreSQL在官网上标称为世界上最先进的开源数据库,而MySQL在官网上标称的是世界上最流行的开源数据库,可见PostgresSQL还是比较高调的。一、PostgreSQL初体验首先是数据库的安装,PostgreSQL官网......