一、介绍

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

作用:用于保证数据的完整性和一致性
主要分为:

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

说明:

1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'
age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)

二、not null与default

是否可为空,null表示空,非字符串
not null - 不可为空
null-可为空 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
==================not null====================
mysql> create table t1(id int); #id字段默认可以插入空
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int() | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
mysql> insert into t1 values(); #可以插入空 mysql> create table t2(id int not null); #设置字段id不为空
mysql> desc t2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int() | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
mysql> insert into t2 values(); #不能插入空
ERROR (HY000): Field 'id' doesn't have a default value ==================default====================
#设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
mysql> create table t3(id int default );
mysql> alter table t3 modify id int not null default ;

三、 unique

unique约束唯一表示数据库中的每条记录

============设置唯一约束 UNIQUE===============
方法一:
create table department1(
id int,
name varchar() unique,
comment varchar()
); 方法二:
create table department2(
id int,
name varchar(),
comment varchar(),
constraint uk_name unique(name)
); mysql> insert into department1 values(,'IT','技术');
Query OK, row affected (0.00 sec)
mysql> insert into department1 values(,'IT','技术');
ERROR (): Duplicate entry 'IT' for key 'name'

联合唯一

create table service(
id int primary key auto_increment,
name varchar(),
host varchar() not null,
port int not null,
unique(host,port) #联合唯一
); mysql> insert into service values
-> (,'nginx','192.168.0.10',),
-> (,'haproxy','192.168.0.20',),
-> (,'mysql','192.168.0.30',)
-> ;
Query OK, rows affected (0.01 sec)
Records: Duplicates: Warnings: mysql> insert into service(name,host,port) values('nginx','192.168.0.10',);
ERROR (): Duplicate entry '192.168.0.10-80' for key 'host'

四、 primary key

primary key字段的值不为空且唯一

一个表中可以:

单列做主键
多列做主键(复合主键)

但一个表内只能有一个主键primary key

============单列做主键===============
#方法一:not null+unique
create table department1(
id int not null unique, #主键
name varchar() not null unique,
comment varchar()
); mysql> desc department1;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int() | NO | PRI | NULL | |
| name | varchar() | NO | UNI | NULL | |
| comment | varchar() | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec) #方法二:在某一个字段后用primary key
create table department2(
id int primary key, #主键
name varchar(),
comment varchar()
); mysql> desc department2;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int() | NO | PRI | NULL | |
| name | varchar() | YES | | NULL | |
| comment | varchar() | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
rows in set (0.00 sec) #方法三:在所有字段后单独定义primary key
create table department3(
id int,
name varchar(),
comment varchar(),
constraint pk_name primary key(id); #创建主键并为其命名pk_name mysql> desc department3;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int() | NO | PRI | NULL | |
| name | varchar() | YES | | NULL | |
| comment | varchar() | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec)

多列主键

==================多列做主键================
create table service(
ip varchar(),
port char(),
service_name varchar() not null,
primary key(ip,port)
); mysql> desc service;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ip | varchar() | NO | PRI | NULL | |
| port | char() | NO | PRI | NULL | |
| service_name | varchar() | NO | | NULL | |
+--------------+-------------+------+-----+---------+-------+
rows in set (0.00 sec) mysql> insert into service values
-> ('172.16.45.10','','mysqld'),
-> ('172.16.45.11','','mariadb')
-> ;
Query OK, rows affected (0.00 sec)
Records: Duplicates: Warnings: mysql> insert into service values ('172.16.45.10','','nginx');
ERROR (): Duplicate entry '172.16.45.10-3306' for key 'PRIMARY'

五、 auto_increment

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

#不指定id,则自动增长
create table student(
id int primary key auto_increment,
name varchar(),
sex enum('male','female') default 'male'
); mysql> desc student;
+-------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+----------------+
| id | int() | NO | PRI | NULL | auto_increment |
| name | varchar() | YES | | NULL | |
| sex | enum('male','female') | YES | | male | |
+-------+-----------------------+------+-----+---------+----------------+
mysql> insert into student(name) values
-> ('egon'),
-> ('alex')
-> ; mysql> select * from student;
+----+------+------+
| id | name | sex |
+----+------+------+
| | egon | male |
| | alex | male |
+----+------+------+ #也可以指定id
mysql> insert into student values(,'asb','female');
Query OK, row affected (0.00 sec) mysql> insert into student values(,'wsb','female');
Query OK, row affected (0.00 sec) mysql> select * from student;
+----+------+--------+
| id | name | sex |
+----+------+--------+
| | egon | male |
| | alex | male |
| | asb | female |
| | wsb | female |
+----+------+--------+ #对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
mysql> delete from student;
Query OK, rows affected (0.00 sec) mysql> select * from student;
Empty set (0.00 sec) mysql> insert into student(name) values('ysb');
mysql> select * from student;
+----+------+------+
| id | name | sex |
+----+------+------+
| | ysb | male |
+----+------+------+ #应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它
mysql> truncate student;
Query OK, rows affected (0.01 sec) mysql> insert into student(name) values('egon');
Query OK, row affected (0.01 sec) mysql> select * from student;
+----+------+------+
| id | name | sex |
+----+------+------+
| | egon | male |
+----+------+------+
row in set (0.00 sec)

相关设置

#在创建完表后,修改自增字段的起始值
mysql> create table student(
-> id int primary key auto_increment,
-> name varchar(),
-> sex enum('male','female') default 'male'
-> ); mysql> alter table student auto_increment=; mysql> show create table student;
.......
ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 mysql> insert into student(name) values('egon');
Query OK, row affected (0.01 sec) mysql> select * from student;
+----+------+------+
| id | name | sex |
+----+------+------+
| | egon | male |
+----+------+------+
row in set (0.00 sec) mysql> show create table student;
.......
ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 #也可以创建表时指定auto_increment的初始值,注意初始值的设置为表选项,应该放到括号外
create table student(
id int primary key auto_increment,
name varchar(),
sex enum('male','female') default 'male'
)auto_increment=; #设置步长
sqlserver:自增步长
基于表级别
create table t1(
id int。。。
)engine=innodb,auto_increment= 步长= default charset=utf8 mysql自增的步长:
show session variables like 'auto_inc%'; #基于会话级别
set session auth_increment_increment= #修改会话级别的步长 #基于全局级别的
set global auth_increment_increment= #修改全局级别的步长(所有会话都生效) #!!!注意了注意了注意了!!!
If the value of auto_increment_offset is greater than that of auto_increment_increment, the value of auto_increment_offset is ignored.
翻译:如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略
比如:设置auto_increment_offset=,auto_increment_increment= mysql> set global auto_increment_increment=;
Query OK, rows affected (0.00 sec) mysql> set global auto_increment_offset=;
Query OK, rows affected (0.00 sec) mysql> show variables like 'auto_incre%'; #需要退出重新登录
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | |
| auto_increment_offset | |
+--------------------------+-------+ create table student(
id int primary key auto_increment,
name varchar(),
sex enum('male','female') default 'male'
); mysql> insert into student(name) values('egon1'),('egon2'),('egon3');
mysql> select * from student;
+----+-------+------+
| id | name | sex |
+----+-------+------+
| | egon1 | male |
| | egon2 | male |
| | egon3 | male |
+----+-------+------+ 步长increment与起始偏移量offset:auto_increment_increment,auto_increment_offset

auto_increment时增加新内容

清空表:

delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。

truncate table t1;数据量大,删除速度比上一条快,且直接从零开始

六、 foreign key

一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。

"Persons" 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

"Orders" 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1

请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。

"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。

"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。

FOREIGN KEY 约束用于预防破坏表之间连接的动作。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY,先创建好被关联的Persons表(省略)

CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)

如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束

ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)

如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)

撤销 FOREIGN KEY 约束

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders


Mysql完整约束性的更多相关文章

  1. MySQL隔离性及Spring事务

    一.数据库事务ACID特性 必须要掌握事务的4个特性,其中事务的隔离性之于MySQL,对应4级隔离级别. 原子性(Atomicity): 事务中的所有原子操作,要么都能成功完成,要么都不完成,不能停滞 ...

  2. mysql 隔离性与隔离级别

    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱. 转账过程具体到程序里会有一系列的操作,比如 ...

  3. mysql 完整约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  4. 了解数据模型、以及MySQL使用的数据模型

    1.什么是数据模型? 数据模型是数据库系统的核心与基础,是关于数据与数据之间的联系.数据的语义.数据一致性约束的概念性工具的集合. 数据模型的三个组成部分: 数据结构.数据操作.完整性约束. 数据操作 ...

  5. mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

  6. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  7. 【mysql】mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

  8. mysql分表与分区表

    mysql分表与分区表 转自:http://blog.51yip.com/mysql/949.html   一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具 ...

  9. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

随机推荐

  1. 解读经典《C#高级编程》泛型 页114-122.章4

    前言 本章节开始讲解泛型..Net从2.0开始支持泛型,泛型不仅是C#的一部分,也与IL代码紧密集成.所以C#中泛型的实现非常优雅.相对于C#,Java是后期引入的泛型,受限于最初的设计架构,就实现的 ...

  2. 第16章 使用ASP.NET Core Identity - Identity Server 4 中文文档(v1.0.0)

    注意 对于任何先决条件(例如模板),首先要查看概述. IdentityServer旨在提供灵活性,其中一部分允许您为用户及其数据(包括账户密码)使用所需的任何数据库.如果您从新的用户数据库开始,那么A ...

  3. 关闭open页面时刷新父页面列表

    var winObjEI = window.open("/Invoice/InvoiceViewEI?invoiceid=" + data.InvoiceId); ; //关闭op ...

  4. 用node.js express设置路径后 子路径下的页面访问静态资源路径出问题

    在routes/news_mian.js 设置了访问news_main.html 的路径 '/',通知设置一个访问news-page.html的子路径'/newspage'子路径.但是在访问loacl ...

  5. 17 , CSS 区块、浮动、定位、溢出、滚动条

    1.CSS 中区块的使用 2.CSS 中浮动的使用 3.CSS 中定位的使用 4.CSS 中溢出的使用 5.CSS 中滚动条的使用 17.1 CSS 中区块的使用 属性名称 属性值 说明 width ...

  6. Java自学总结--简介

    学习Java一年多了,练习了很多,这条路真的很难走.还有半年多毕业的我整理整理所学习的笔记给大家分享主要也是让自己记忆加深.自学时用到的时阿发老师的教学视频,通俗易懂还有题库可以练习.最经典的就是阿发 ...

  7. 集成Android人脸识别demo分享

    本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...

  8. 推荐一款关于MongoDB日志分析的工具--Mtools

    一. 需求背景 MongoDB数据库的强大的文档模型使其成为处理数据的最佳方式.文档适用于广泛的流行数据模型,支持各种各样的场景.文档模型可以包含键值.关系数据集和图形数据集,当然,还可以包含父子关系 ...

  9. webmagic 基本的方法

    WebMagic的结构分为Downloader.PageProcessor.Scheduler.Pipeline四大组件,并由Spider将它们彼此组织起来.这四大组件对应爬虫生命周期中的下载.处理. ...

  10. Asp.net Core应用程序部署为服务

    安装前使用dotnet命令运行下看网站能不能正常运行 1.下载nssm,下载后解压文件 下载地址:https://nssm.cc/usage 2.使用命令行工具进入到nssm的目录: 3.执行服务安装 ...