mysql添加字段时定义候选键_MySQL 表约束

约束概述

对数据表中数据的限制条件叫表的约束,目的是为了保证表中记录的完整和有效。例如非空、唯一等。

查看约束

1 通过查看建表语句 查看表中的约束

show create table tb_name;

2 通过检查约束表 查看约束

select * from information_schema.table_constraints where table_name='usr';

Tips:在MySQL数据库中 所有的约束都存放在information_schema.table_constraints表中~~~~参看~~~~~information_schema数据库介绍

主键约束

什么是主键约束

在MySQL中主键是一种约束,也是一种索引。被设为主键的字段 要求 不重复 不能为空 不能缺省。主键的作用为唯一的确定表中的一条记录。需要注意的是 当主键是复合主键时,不重复的含义是 组合起来不重复即可,单列值允许重复,但不允许同时重复

创建主键

1 在字段中定义主键

create table if not exists user(

id int(11) auto_increment primary key,

name char(64) not null default 'No Name'

);

2 字段定义结束后定义主键

create table if not exists user(

id int(11) auto_increment,

name char(64) not null default 'No Name',

primary key(id,name)

);

-- 注意 声明主键的完整格式应该是这样的

-- constraint 约束名 primary key key_name

3 建表完成后添加主键

上边的两种方式都是在创建表时候指定主键约束,也可以在表建成后添加主键约束

alter table tb_name add primary key(key_name)

-- tb_name 表名

-- primary key() 括号里填写字段名,可以是一个 也可以是多个(复合主键)

删除主键

-- 如果主键字段中包含有自增 auto_increment,需要先删除自增属性 在删除主键

-- 如果没有自增直接删除主键即可

-- 删除自增类型。 !!!注意 自增是类型 所以 可以使用 修改字段的类型就ok

--1 修改字段的名 修改后需要重新指定类型

alter table tb_name change col_name col_name int;

--2 简单的直接修改类型

alter table tb_name modify col_name int;

-- 删除掉 auto_increment属性后可以删除主键

alter table tb_name drop primary key;

主键的分类

1 单一主键

创建 1 中 创建的 id 就是单一的主键,需要注意,定义字段时声明主键是无法创建复合主键的。

2 复合主键

创建 2 中的创建主键的方式 允许创建单一主键也允许创建复合主键,推荐使用这种方法进行主键的创建。

3 联合主键

当处理多对多的关系时,需要创建中间表来进行多对多的关联,此时中间表的主键成为联合主键,他能唯一的确定多对多的若干实体间的对应关系。联合主键也可以是复合主键即联合主键由第三表的多个列复合而成。保持唯一。

外键约束

什么是外键

外键依托于具有唯一约束的字段,一般来讲主键会多一些,但是也可以不是主键。前提是它们具有唯一约束。外键依赖的字段可以来自本(自参照表)也可以是其他表,一般的是其他表的情况多一些。此时要求 主表必须已经存在于数据库中,或者是当前正在创建的表。如果被依赖字段在本表中,那么这样的约束结构称为 自参照完整性。

Tips: 虽然主键不允许为空不允许重复,但是外键可以为空,也可以重复。外键约束要求每一个值都来自于主键,特别的插入空值时,MySQL不支持缺省,必须显式表达出来,例如

insert into user(name,leader_id) values('monkey',null);

-- 显示的写出 null 否则 会报错

insert into user(name,leader_id) values('monkey');

-- 是不合法的语句

在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。

外键中列的数目必须和父表的主键中列的数目相同。

外键中列的数据类型必须和父表主键中对应列的数据类型相同。

创建外键

1 建表时创建外键

[constraint ] foreign key(fk_col_name [,col_name2,…])

references (pk_col_name1 [,pk_col_name2,…])

-- fk_name外键名

-- fk_col_name设置外键字段的字段名

-- tb_name外键关联的主表表名

-- pk_col_name 主表被依赖的字段名

2 建表完成后创建

alter table tb_name add [constriant ] foreign key(fk_name) references tb_name(pk_col_name)

-- fk_name外键名

-- fk_col_name设置外键字段的字段名

-- tb_name外键关联的主表表名

-- pk_col_name 主表被依赖的字段名

例子

-- 创建主表 leader

create table leader(

id int(11) primary key auto_increment,

name char(64) not null

);

-- 创建外键所在表 employee

create table employee(

id int(11) primary key auto_increment,

name char(64) not null,

leader_id int(11),

constraint fk_leader_employee foreign key(leader_id) references leader(id)

);

create table employee(

id int(11) primary key auto_increment,

tid char(11),

name char(64) not null,

leader_id int(11),

constraint fk_leader_employee foreign key(name) references leader(name)

);

注意

外键 和 关联的主表字段类型必须一致,但是允许size不一致,但是这样可能会出现无法预期的问题,不推荐这样做,曾经在使用django的ORM时,手写了migrations文件,导致出现类似情况,很大的坑。

外键字段可以是主表的多个字段(复合主键或者其他的情况都是被允许的,但是此时要保证关联字段和被关联字段要能对应起来)

特别要说明的是,作为其他表外键的主表字段必须是具有唯一约束(主键字段原生就自带 unique 属性,如果不是主键,那必须要手动的设置unique 当是外键是多个字段时,需要设置复合唯一)

删除外键

同删除主键类似,不同的是,每张表只有一个主键,因此不需要指定主键名,但是外键 外键名是不虚指定的。

alter table tb_name drop foreign key fk_name;

-- fk_name 外键约束名 也就是 constrain 后面的名字

唯一约束

什么是唯一约束

唯一约束就是要求字段中的值是唯一,特别的它允许为空,但只能出现一个空值。唯一约束可以确保一列不出现重复值,或者若干列不出现重复的组合。

创建唯一约束

1 字段定义时添加

create table leader(

id int(11) primary key auto_increment,

name char(64) unique,

);

-- name 字段唯一 ,不允许有重名的出现

2 字段定义完成后添加

create table leader(

id int(11) primary key auto_increment,

name char(64),

constraint uq_name unique key(name) -- 在这里写唯一约束 与主键类似

);

注意

唯一约束和主键约束的区别在于主键中不许出现null 但是唯一 要求只能出现一个空值

一张表中可以有若个个唯一约束,但是只能存在一个主键约束

3 建表完成后添加

alter table tb_name add [constaint uq_name] unique key(uq_col_name)

-- tb_name 要修改的表名

-- uq_name 约束名

-- uq_col_name 声明唯一的字段名

-- 约束名 可以不写

删除唯一约束

alter table tb_name drop index fk_name;

-- tb_name 表名

-- fk_name 约束名

默认值约束和非空约束

default 应该被称为默认值约束,他也是一种约束,作用和简单,指定某字段的默认值

创建默认值约束

1 字段中定义默认值/非空

create table user(

id int(11) auto_increment primary key,

age int(4) default 18,

name char(64) not null

);

2 表建成后添加

alter table tb_name change col_name col_type[size] default

-- 就是简单的修改表的结构语句

alter table user change col_name col_type[size] {default 默认值 | not null | null }

删除默认值/非空约束

-- 修改表结构 将默认值 设置为null

alter table tb_name change col_name col_type[size] default null;

-- 或者

-- 修改表结构 修改字段的类型

alter table tb_name modify col_name col_type[size];

检查约束

MySQL不支持检查约束,官方文档上说,即使设置了检查约束,但是mysql不会强制的要求这样做。创建之后在information_schema.table_constraints 找不到相关的记录。甚至他可能本身就不存在。

什么是检查约束

检查约束一般来说是为了满足用户实际的实体完整性而存在的。例如 身高应该 high > 10 and high < 280

创建检查约束

1 创建表时添加

check

-- 例子

create table userinfo(

id int(11) auto_increment primary key,

high int(4) default 160,

weight int(4) default 50,

check(heigh > 10 and heigh < 280)

);

2 创建完成后添加

alter table userinfo add constraint check_name check(约束条件)

-- 例如

alter table userinfo add constraint check_weight check(weight > 10 and weight < 300);

删除检查约束

alter table tb_name drop constraint check_name;

-- 例如

alter table userinfo drop constraint check_weight;

-- 值得注意的是,mysql 虽然说创建成功了,但是在information_schema 数据库的 table_constraints 表中并不能找到相关的信息。MySQL不支持检查约束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跳槽9招让你“空降”任何企业都能成功

2019独角兽企业重金招聘Python工程师标准>>> 作为一名职业经理人&#xff0c;没有谁没跳过槽&#xff0c;撇开在跳槽时对所“空降”的企业所需要的行业知识知根知底而“得心应手”&#xff0c;从而“稳定”外&#xff0c;其他人可能或多或少都有过因“不适应”新单位…

这个年纪,喜欢你的肉体还会送你包的,原来是......

1 iPhone 12一出王守义成最大赢家&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 想搭免费车的喵&#xff08;dy&#xff1a;大兔几&#xff09;▼3 拼纹身的有吗&#xff1f;纹在我身&#xff0c;刀在你身▼4 那你泡啥&#xff1f;▼5 快把知识君p上去&#xff…

Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)

Response. AppendHeader使用大全文件下载&#xff0c;指定默认名 Response.AddHeader(”content-type”,”application/x-msdownload”); Response.AddHeader(”Content-Disposition”,”attachment;filename要下载的文件名.rar”); 刷新页面 Response.AddHeader “REFRESH”, …

C# WPF MVVM模式Caliburn.Micro框架下事件发布与订阅

01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信&#xff0c;Caliburn提供了一种事件机制&#xff0c;可以在应用程序中低耦合的模块之间进行通信&#xff0c;该机制基于事件聚合器服务&#xff0c;允许发布者和订阅者之间通过事件进行通讯&#xff0c;且彼…

mysql触发器 node_node.js中事件触发器events的使用

node.js是基于事件驱动的&#xff0c;通过events&#xff0c;我们可以方便的创建事件&#xff0c;并通过触发事件来调用我们自定义的监听函数。所有能触发事件的对象都应该是 EventEmitter 类的实例&#xff0c;一般我们自定义一个类继承于 EventEmitter 类。通过on()方法我们可…

Android之UI线程与子线程交互设计的5种方法

转载地址:http://www.cr173.com/html/19165_1.html 在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新开启一个后台线程运行这些任务。然而,往往这些任务最终又会直接或者间接的需要访…

svn: Can't open file '/a/b/db/txn-current-lock': Permission denied

SVN新建完版本库&#xff0c;在提交的时候报出如下错误 svn: Cant open file /a/b/db/txn-current-lock: Permission denied Permission denied svn: Cant make directory /a/b/dav/activities.d: Permission denied Permission denied 解决方法&#xff1a; chmod -R 755 /a/b…

常用的加密算法---数字摘要

数字摘要&#xff1a;数字摘要也称为消息摘要&#xff0c;它是一个唯一对应一个消息或文本的固定长度的值&#xff0c;它是一个单向Hash函数对消息进行计算产生的。摘要生成的过程&#xff1a;待摘要串-----> Hash函数-----> 摘要消息摘要的特点&#xff1a;1.无论输入的…

清华最强本科生Top10出炉,从来没有什么天才学霸!

全世界只有3.14 % 的人关注了爆炸吧知识‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍本文转自&#xff1a;量子位作者&#xff1a;木易 鱼羊一年一度&#xff0c;清华园里的“神仙打架”&#xff0c;投票结果已经出炉。根据清华大学官方消息&#xff0c;2020年清华大学特等奖学金&#x…

day19(中)_IO流3(模拟缓冲区,装饰设计模式)

1.MyBufferedReader和MyBufferedInputStream 1.模拟字符读取流的缓冲区: /*根据readLine原理:自定义一个类包含一个功能和readLine一致的方法来模拟以下BufferedReader方法 */ package myreadline; import java.io.FileReader; import java.io.IOException;class MyBufferedRea…

手把手教你学Dapr - 8. 绑定

介绍使用绑定&#xff0c;您可以使用来自外部系统的事件触发您的应用程序&#xff0c;或与外部系统交互。这个构建块为您和您的代码提供了几个好处&#xff1a;消除连接和轮询消息系统&#xff08;如队列和消息总线&#xff09;的复杂性关注业务逻辑&#xff0c;而不是如何与系…

python win7 sp1_[ Python - 15 ] win7安装paramiko问题总汇

安装环境&#xff1a;win7 sp1 python3.5 安装paramiko新装的win7 sp1 x64位系统&#xff0c;安装好python3.5和pycharm后&#xff0c;需要用到paramiko模块于是开始安装&#xff1a;>>pip install paramiko报错&#xff1a;warning: GMP or MPIR library not found; Not…

Android之百度地图定位最详细使用总结

Android之百度定位 如果项目里面有定位功能的话,一般还是觉得蛮高大上的,我们项目用的百度定位,到网上找了很多资料,很多都不全面,很多博客都没有小伙伴期望得到当前的省和城市出来,然后自己动手也有很多错误,不知道错在哪里,也在网上找为什么…

CountDownLatch应用实战

2019独角兽企业重金招聘Python工程师标准>>> 1. CountDownLatch简介 一个同步辅助类&#xff0c;在完成一组正在其他线程中执行的操作之前&#xff0c;它允许一个或多个线程一直等待。其本质就是一个共享锁。 他最主要的作用是用来同步java的线程。 主要有以下三个方…

用JoyToKey使游戏手柄变键盘或鼠标

用JoyToKey使游戏手柄变键盘或鼠标 除了用手柄来玩游戏外&#xff0c;你有没有想过利用手柄做点别的什么事情呢&#xff1f;其实&#xff0c;只要结合一个非常小巧的游戏控制器增强软件JoyToKey&#xff0c;我们就能最大限度地挖掘手柄的潜力&#xff0c;用它来完成在以前看来“…

40张令人震惊的对比图,第一张细思恐极

全世界只有3.14 % 的人关注了爆炸吧知识世界之大&#xff0c;无奇不有。来看Reddit网友们分享的一组对比图&#xff0c;涨涨姿势&#xff01;医生对戴口罩和不戴口罩的培养皿分别&#xff1a;打喷嚏&#xff0c;唱歌&#xff0c;说话和咳嗽之后的区别&#xff08;难怪有些国家疫…

mysql查找最高分最低分_sql查询最高分、最低分和平均分语句

sql 查询最高分、最低分和平均分语句//我们要用就以学生成绩为实例吧/*结构学生表Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号*/查询各科成绩最高分、最…

Smark.Data 1.5更新详解

由于一直忙于Beetle的开发和优化&#xff0c;Smark.Data组件已经有很长一段时间更新。这段时间发现Smark.Data在某些情况下不足&#xff0c;而这些情况又比较普遍所以进行了1.5版的更新。其更新的主要功能包括:查询可填充到自定义对象中&#xff0c;可直接执行存储过程和执行存…

Sql 存储过程加游标结合的使用

创建一个存储过程使用游标 如果该职工入职时间超过3年 并且学历 在本科以上 则对该职工工资加10%如果 学历没达到本科的 入职时间在10年以上 同样对该职工工资追加8% 其他的一律不加 CREATE proc jiagongzi as declare name nvarchar(20) declare xueli nvarchar(20) declare…

C# 数据适配器之 DataAdapter 对象

01 DataAdapter 对象概述DataAdapter 对象是一个数据适配器对象&#xff0c;是DataSet 与数据源之间的桥梁。DataAdapter 对像提供了 4 个属性&#xff0c;用于实现与数据源之间的互通。SelectCommand 属性&#xff1a;向数据库发送查询 SQL 语句。 DeleteCommand 属性&#x…