第3章 字段的属性和约束
- 格式:ppt
- 大小:74.00 KB
- 文档页数:12
数据库的约束简介约束的简介数据的完整性是指数据的正确性和⼀致性,可以通过定义表时定义完整性约束,也可以通过规则,索引,触发器等。
约束分为两类:⾏级和表级,处理机制是⼀样的。
⾏级约束放在列后,表级约束放在表后,多个列共⽤的约束放在表后。
完整性约束是⼀种规则,不占⽤任何数据库空间。
完整性约束存在数据字典中,在执⾏SQL或PL/SQL期间使⽤。
⽤户可以指明约束是启⽤的还是禁⽤的,当约束启⽤时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中。
约束类型总的来说有五种:唯⼀性和主键约束、外键约束、检查约束、空值约束、默认值约束,有五⼤关键词,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT1。
唯⼀性和主键约束。
要求某⼀列,或⼏列不能有重复的值,建⽴主键约束和唯⼀约束时,Oralce会基于约束列⾃动建⽴唯⼀索引;主键约束不允许为NULL,唯⼀约束允许为NULL,⼀张表只能建⽴⼀个主键约束。
唯⼀性和主键约束类似,只是关键词不同⽽已,语法⼀致。
创建约束CREATE TABLE TABLE_NAME(COL1 VARCHAR2(32) NOT NULL PRIMARY KEY,)CREATE TABLE TABLE_NAME(COL1 VARCHAR2(32) NOT NULL CONSTRAINT PK_ID PRIMARY KEY,)CREATE TABLE TABLE_NAME(COL1 VARCHAR2(32) NOT NULL,COL2 VARCHAR2(32) NOT NULL Foreign Key,CONSTRAINT PK_TABLE_NAME PRIMARY KEY(COL1,COL2))修改约束ALTER TABLE Table_NameADD CONSTRAINT PK_Table_Name PRIMARY KEY NONCLUSTERED(Col1)【这⾥表明了是聚集还是⾮聚集主键索引】如果唯⼀性约束保护多个数据列,那么唯⼀性约束要作为表约束增加。
MySQL中的数据字段属性设置MySQL是目前最流行的关系型数据库管理系统之一,广泛应用于各类网站和应用程序中。
对于数据库的设计与优化,数据字段属性的设置是非常重要的一部分。
本文将围绕MySQL中的数据字段属性设置展开讨论,探索不同属性设置对数据库性能和数据存储的影响。
一、数据字段属性的基本概念在MySQL中,每个数据表都由一系列的数据字段组成。
每个字段都具有特定的类型和属性,用于存储和描述不同类型的数据。
常见的数据字段类型包括整数型、字符型、日期型等。
数据字段属性是用于进一步定义字段的特性和约束条件的设置。
它们可以控制字段是否允许为空、字段的默认值、字段的长度和精度、字段是否唯一等。
正确地设置数据字段属性可以确保数据的完整性和一致性,同时也可以提高查询和插入操作的效率。
二、字符型字段属性设置字符型字段是存储文本字符串的常见数据类型。
在MySQL中,可以通过不同的属性设置来指定字符型字段的长度、字符集和排序规则。
下面是一些常用的字符型字段属性设置:1. 字段长度:字符型字段的长度可以通过指定字段的最大字符数来设置。
合理设置字段长度可以避免数据截断,同时也可以节省存储空间。
2. 字符集:MySQL支持多种字符集,包括UTF-8、GBK等。
通过设置字符集,可以确保数据能够正确地存储和展示。
3. 排序规则:通过设置排序规则,可以控制字符型字段在进行比较和排序时的行为。
常见的排序规则包括二进制排序和不区分大小写排序。
三、数值型字段属性设置数值型字段用于存储数值数据,包括整数和小数。
在MySQL中,可以通过不同的属性设置来指定数值型字段的数据类型、长度和精度。
下面是一些常用的数值型字段属性设置:1. 数据类型:对于整数型,可以选择TINYINT、INT、BIGINT等不同的数据类型。
对于小数型,可以选择DECIMAL、FLOAT、DOUBLE等不同的数据类型。
选择合适的数据类型可以避免数据溢出和损失精度的问题。
字段和属性的理解在get和set访问器中都加⼊了条件,并且是我⼿动书写的,VS给我们提供了⼀个⾃动封装字段的⽅法,下⾯我们来按照我说的步骤来试⼀下,在类中定义⼀个字段 string a="我是A"; 接着把⿏标停放到a处,点击右键“重构”--“封装字段”,VS会⾃动的封装a字段,并且取名为A,你也可以更改属性的名字,点击确定,a字段的A属性就封装好了,封装后的代码为:string a = "我是A";public string A{get { return a; }set { a = value; }}通常我们都习惯叫get访问器和set访问器,如果我们想得到类中的属性值时,⽤到的是get访问器return返回出值,如果我们想给属性赋值的时候,就会⽤到set访问器,属性有4种形式:分别是可读可写属性,既有get也有set访问器;如果只有get访问器,这个属性是只读的,⽆法赋值;如果只有set访问器,这个属性就只能被赋值,不能读取,以后我们要学习界⾯设计时,所有的控件都有很多的属性,这些属性就都是只写的,并且有⼀定的赋值要求,⽐如在⽹页上画⼀个表格,我们设置表格的边框颜⾊,就使⽤到边框颜⾊的属性,如果我们赋的颜⾊值不符合规范,就会出现错误提⽰;还有⼀种属性是加⼊了static关键字的静态属性,静态属性只能封装静态数据,⽐如:string static a = "我是静态A";public static string A{get { return a; }set { a = value; }}下⾯我们把上⾯的例⼦继续深化,声明⼀个对象boby,我们来具体看⼀下如果利⽤属性的读写功能:1 class Ren2 {3 //先定义⼀个私有变量实际年龄age4 int age = 10;56 //再定义⼀个属性,7 public int Age8 {9 //输出时的年龄⽐实际年龄age⼤三岁,即输出的是10+3岁10 get { return age + 3; }11 //给年龄赋值时,先判断年龄的范围12 set13 {14 //如果年龄⼩于1岁或是⼤于120岁时,不允许赋值,提⽰错误。
MySQL中的字段属性与约束设计指南导语:在数据库设计中,字段属性与约束的设置对于数据的完整性和性能至关重要。
MySQL是一种常见的关系型数据库管理系统(RDBMS),并且在许多应用中被广泛使用。
本文将介绍MySQL中字段属性与约束的设计指南,帮助您正确地定义和使用这些特性,以优化数据结构并提高数据库性能。
一、字段属性设计指南1. 数据类型的选择在MySQL中,不同的数据类型具有不同的存储需求和操作特性。
因此,正确选择合适的数据类型对于优化数据库结构至关重要。
以下是一些常见的数据类型以及它们的特点:- 整数类型(INT、BIGINT):适用于整数数据,具有较小的存储需求和高效的比较操作。
- 浮点数类型(FLOAT、DOUBLE):适用于具有小数部分的数值,但具有一定的精度损失。
- 字符串类型(CHAR、VARCHAR):适用于存储文本数据,CHAR具有定长特性,而VARCHAR具有变长特性。
- 日期和时间类型(DATE、DATETIME):适用于存储日期和时间信息,具有方便的处理函数。
在选择数据类型时,需要根据具体的数据特点和需求来确定。
如果数据量较大,应优先考虑较小的数据类型来降低存储空间和提高性能。
2. 字段长度设定针对字符串类型的字段,长度限制是一项重要的属性设置。
太小的长度限制会导致数据截断或被截断,而过大的长度限制则会浪费存储空间。
因此,需要根据实际业务需求来合理地设置字段长度。
例如,对于用户名字段,如果业务需求是用户名长度不超过20个字符,则可以将该字段定义为VARCHAR(20),这样可以确保存储的数据不会超出限制,并且不会浪费额外的存储空间。
3. 空值属性设定在MySQL中,字段可以被设置为允许为空值或不允许为空值。
对于某些字段,如主键字段或必填字段,可以设置为不允许为空值,以确保数据的完整性。
另一方面,对于某些可选字段,可以将其设置为允许为空值,以便在数据录入时更加灵活。
但是,需要注意在查询和数据处理时对空值进行适当的处理,以免出现意外的结果。
国家开放大学《数据库基础与应用》形考任务1-4完整答案课程考核本课程考核采用形成性考核与终结性考试相结合的方式。
形成性考核占课程综合成绩的30%,终结性考试占课程综合成绩的70%。
最终成绩=形考成绩30%+终考成绩70%考核方式相关信息以国家开放大学当学期发布的考试安排文件为准。
一、单选题1.在利用计算机进行数据处理的四个发展阶段中,第三个发展阶段是()。
【答案】数据库系统2.属性的取值范围被称为()。
【答案】域3.实用ER图进行描述的是()。
【答案】概念数据模型4.若实体A和B是1对多的联系,实体B和C是1对1的联系,则实体A和C 是()联系。
【答案】1对多5.若实体A和B是多对多的联系,实体B和C是1对1的联系,则实体A和C 是()联系。
【答案】多对多6.下面不属于数据库体系结构中三级模式的是()。
【答案】关系模式7.在文件系统中,存取数据的基本单位是()。
【答案】记录8.层次数据模型的结构是一种()。
【答案】树结构9.一个关系中的每一行称为一个()。
【答案】元组10.设D1、D2和D3定义域中的基数分别为2、3和4,则D1×D2×D3的元组数为()。
【答案】2411.设D1、D2、D3和D4为定义域,则在它们的笛卡尔积的运算结果中,每个元组具有的分量个数为()。
【答案】412.设关系R1具有a1个属性和b1个元组,关系R2具有a2个属性和b2个元组,则关系R1×R2所具有的属性个数为()。
【答案】a1+a213.若一个关系为R(学生号,姓名,性别,年龄),则可以作为主码的属性为()。
【答案】学生号14.设两个关系R1和R2中分别包含有m和n个元组,R1对R2存在着一对多的联系,将其进行自然连接,在得到的运算结果中最多包含的元组个数为()。
【答案】n15.设一个关系R1中的属性A是外码,它对应关系R2中的主码为B,其中被称为父关系的是()。
【答案】R216.设一个集合A={3,4,5,6,7},另一个集合B={1,3,5,7,9},则A和B的交集中包含的元素个数为()。
MySQL 字段完整性约束(重要)⽬录完整性约束(重要):主键,唯⼀标识,表都会拥有,不设置为默认找第⼀个 不空,唯⼀ 字段,未标识则创建隐藏字段:外键,外键要通过foreign key 语法建⽴表与表之间的关联:唯⼀性数据, 该条字段的值需要保证唯⼀,不能重复:⾃增,只能加给key 的int 类型字段,作为辅助修饰,⼀个表中只能设置⼀个⾃增字段:不为空 - 针对⼀些字段,如注册时的⽤户名,出⽣⼈的性别等,这些需求下的字段,只不能设置为Null ,必须要对其赋值:默认值 - 对有默认值意外的字段进⾏赋值时,有默认值的字段会被赋默认值:⽆符号 - 存储的数字从0开始: 0填充 - 存整数时数据长度⼩于取值范围长度,会在数字左⽅⽤0填充外键外键是 建⽴表与表关联 的字段,通常 ⼀个表的外键 是 另⼀个表的主键(唯⼀键也可以)多表关系⼀对⼀例如:丈夫-妻⼦,⽤户-⾝份证,作者-作者详情外键在任何⼀⽅都可以,此时外键要设置 唯⼀键没有级联关系:增加:先增加被关联表记录,再增加关联表记录删除:先删除关联表记录,再删除被关联表记录更新:关联与被关联表都⽆法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)primary key foreign key unique key auto_increment not null default unsigned zerofill # not null 与 default 限制# 不能为空,没有默认值的x ,必须赋值# y 、z 在没有赋值情况下,才有默认值,设置值后,采⽤默认值mysql>: create table td1 (x int not null, y int default 0, z int default 100);# 报错,auto_increment 必须设置给 键字段mysql>: create table td2 (x int auto_increment);# 报错,auto_increment 必须设置给 int 字段mysql>: create table td2 (x char(4) auto_increment);# 报错,auto_increment 字段最多出现 1次mysql>: create table td2 (x int unique auto_increment, y int unique auto_increment);# 正确,主键和唯⼀键分析# x 为主键:没有设置primary key 时,第⼀个 唯⼀⾃增键,会⾃动提升为主键mysql>: create table td21 (x int unique auto_increment, y int unique);# y 为主键:没有设置primary key 时,第⼀个 唯⼀⾃增键,会⾃动提升为主键mysql>: create table td22 (x int unique, y int unique auto_increment);# x 为主键:设置了主键就是设置的,主键没设置⾃增,那⾃增是可以设置在唯⼀键上的mysql>: create table td23 (x int primary key, y int unique auto_increment);# x 为主键:设置了主键就是设置的,主键设置了⾃增,⾃增字段只能有⼀个,所以唯⼀键不能再设置⾃增了mysql>: create table td24 (x int primary key auto_increment, y int unique);# 默认主键:没有设置主键,也没有 唯⼀⾃增键,那系统会默认添加⼀个 隐式主键(不可见)mysql>: create table td25 (x int unique, y int unique);# 唯⼀键:确保⼀个字段,数据不能重复# 主键:是⼀条记录的唯⼀标识(可以理解为数据的编号)# 联合唯⼀# ip 在port 不同时,可以相同,ip 不同时port 也可以相同,均合法# ip 和port 都相同时,就是重复数据,不合法mysql>: create table tu1 (ip char(16), port int, unique(ip, port));# 也可以设置成 联合主键,道理同 联合唯⼀mysql>: create table tu2 (ip char(16), port int, primary key(ip, port));# sql 可以多⾏书写mysql>:create table t22(ip char(16),port int,primary key(ip,port));# 通常⾃增字段的 ⾃增索引 会被永久记录,想清空表并清空⾃增索引:mysql>: truncate 数据库名.表名1、外键的 字段名 可以⾃定义(名字随意),通常命名规范(关联表_关联字段)2、外键要通过 foreign key 语法建⽴表与表之间的关联mysql>: foreign key(所在表的外键字段) references 关联表(关联表已有字段)eg :foreign key(detail_id) references author_detail(id)3、级联关系(更新⼀起更新,删⼀起删)级联更新 on update cascade级联删除 on delete cascade# 重点:外键字段本⾝可以唯⼀或不唯⼀,但是外键字段必须唯⼀"""作者(author):id ,name ,sex ,age ,mobile作者详情(author_detail): id ,info ,address ,author_id"""## 建表# 作者详情(author_detail): id ,info ,address# 作者详情(author_detail): id,info,addresscreate table author_detail(id int primary key auto_increment,info char(50),address char(50));# 作者表(author): id,name,sex,age,mobile, detail_idcreate table author(id int primary key auto_increment,name char(10) not null,sex enum("男","⼥") default "男",age int not null,mobile char(13) unique key not null,detail_id int unique not null, # ⼀对⼀的表必须添加唯⼀键,并且类型和被关联的字段类型⼀致foreign key(detail_id) references author_detail(id) # 设置外键detail_id,是author_detail表中的字段id);## 插⼊# 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');mysql>: insert into author(name,age,mobile,detail_id) values('Tom',18,'133********', 1);## 修改(在被关联表中已被关联的记录不可以直接修改,关联表修改的前提是被关联表必须有⾄少⼀条记录没有被其他表关联)先修改关联表重新指向被关联表中新的记录。
python之数据库(字段的约束条件,表之间的关系)10.6 约束条件10.61 not null 、defaultcreate table t15(id int,name char(16) not null,sex enum('male','female','other') not null default "male");#alter table t15 modify name char(16) not null;insert into t15(id,name) values(1,'egon1'),(2,'egon2'),(3,'egon3');mysql>desc t15;+-------+-------------------------------+------+-----+---------+-------+| Field | Type |Null|Key|Default| Extra |+-------+-------------------------------+------+-----+---------+-------+| id |int(11) | YES ||NULL||| name |char(16) | NO ||NULL||| sex | enum('male','female','other') | NO || male ||+-------+-------------------------------+------+-----+---------+-------+mysql>select*from t15;+------+-------+------+| id | name | sex |+------+-------+------+|1| egon1 | male ||2| egon2 | male ||3| egon3 | male |+------+-------+------+10.62 uniquemysql中存在⼀种专门的数据结构,叫 key,⼜称为索引,通过该数据结构可以减少 i/o 次数,从⽽加速查询效率 index key :只有加速查询的效果,没有约束的功能 unique key:不仅有加速查询的效果,还附加了⼀种约束的功能 primary key:不仅有加速查询的效果,还附加了⼀种约束的功能,并且innodb存储引擎会按照主键字段的值来组织表中所有的数据,所以⼀种inndob表中必须有、⽽且只能有⼀个主键,通常为该表的id字段unique:限制字段的值的唯⼀性,单从约束⾓度去看:唯⼀性约束#单列唯⼀create table t16(id int unique,name char(16));# 联合唯⼀(不能完全相同)create table server(id int unique,ip char(15),port int,unique(ip,port));mysql>desc server;+-------+----------+------+-----+---------+-------+| Field | Type |Null|Key|Default| Extra |+-------+----------+------+-----+---------+-------+| id |int(11) | YES | UNI |NULL||| ip |char(15) | YES | MUL |NULL||| port |int(11) | YES ||NULL||+-------+----------+------+-----+---------+-------+insert into server values(1,'1.1.1.1',3306),(2,'1.1.1.1',3307),(3,'1.1.1.2',3306);mysql>select*from server;+------+---------+------+| id | ip | port |+------+---------+------+|1|1.1.1.1|3306||2|1.1.1.1|3307||3|1.1.1.2|3306|+------+---------+------+10.63 primary keyprimary key:单单从约束⾓度去看,primary key就等同于 not null + unique 强调: 1、⼀张表中必须有,并且只能有⼀个主键 2、⼀张表中都应该有⼀个id字段,⽽且应该把id字段做成主键create table t17(id int primary key,name char(16),age int,sex char(6))engine=innodb;#联合主键(不完全相同,但不能为空)create table t19(ip char(15),port int,primary key(ip,port));mysql>desc t19;+-------+----------+------+-----+---------+-------+| Field | Type |Null|Key|Default| Extra |+-------+----------+------+-----+---------+-------+| ip |char(15) | NO | PRI |||| port |int(11) | NO | PRI |0||+-------+----------+------+-----+---------+-------+10.64 auto_increment只能给被约束成key的字段加⾃增属性,默认起始位置是1,步长也为1# primary key auto_incrementcreate table t20(id int primary key auto_increment,name char(16))engine=innodb;mysql>insert t20(name) values('egon1');mysql>insert t20(name) values('egon2');mysql>select*from t20;+----+-------+| id | name |+----+-------+|1| egon1 ||2| egon2 |+----+-------+10.7 表关系10.71 多对⼀(foreign key)1、把所有数据都存放于⼀张表的弊端:表的组织结构复杂不清晰浪费空间扩展性极差2、寻找表与表之间的关系的⽅法:举例:emp表 dep表步骤⼀: part1: 1、先站在左表emp的⾓度 2、去找左表emp的多条记录能否对应右表dep的⼀条记录part2:1、站在右表dep的⾓度 2、去找右表dep的多条记录能否对应左表emp的⼀条记录 3、如何实现?在emp表中新增⼀个dep_id 字段,该字段指向dep表的id字段4、foreign key会带来什么样的效果?约束1:在创建表时,先建被关联的表dep,才能建关联表empcreate table dep(id int primary key auto_increment,dep_name char(10),dep_comment char(60));mysql>desc dep;+-------------+----------+------+-----+---------+----------------+| Field | Type |Null|Key|Default| Extra |+-------------+----------+------+-----+---------+----------------+| id |int(11) | NO | PRI |NULL| auto_increment || dep_name |char(10) | YES ||NULL||| dep_comment |char(60) | YES ||NULL||+-------------+----------+------+-----+---------+----------------+create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default'male',dep_id int,foreign key(dep_id) references dep(id));mysql>desc emp;+--------+-----------------------+------+-----+---------+----------------+| Field | Type |Null|Key|Default| Extra |+--------+-----------------------+------+-----+---------+----------------+| id |int(11) | NO | PRI |NULL| auto_increment || name |char(16) | YES ||NULL||| gender | enum('male','female') | NO || male ||| dep_id |int(11) | YES | MUL |NULL||+--------+-----------------------+------+-----+---------+----------------+约束2:在插⼊记录时,必须先插被关联的表dep,才能插关联表empinsert into dep(dep_name,dep_comment) values('sb教学部','sb辅导学⽣学习,教授python课程'),('外交部','形象⼤使'),('nb技术部','nb技术能⼒有限部门');mysql>select*from dep;+----+-------------+-------------------------------------------+| id | dep_name | dep_comment |+----+-------------+-------------------------------------------+|1| sb教学部| sb辅导学⽣学习,教授python课程||2|外交部|形象⼤使||3| nb技术部| nb技术能⼒有限部门|+----+-------------+-------------------------------------------+insert into emp(name,gender,dep_id) values('alex','male',1),('egon','male',2),('lxx','male',1),('wxx','male',1),('wenzhou','female',3);mysql>select*from emp;+----+---------+--------+--------+| id | name | gender | dep_id |+----+---------+--------+--------+|1| alex | male |1||2| egon | male |2||3| lxx | male |1||4| wxx | male |1||5| wenzhou | female |3|+----+---------+--------+--------+约束3:更新与删除都需要考虑到关联与被关联的关系(不能直接改变dep表的id) 解决⽅案:1、先删除关联表emp,再删除被关联表dep,准备重建mysql>drop table emp;mysql>drop table dep;2、重建:新增功能:同步更新,同步删除create table dep( #先建被参照的表id int primary key auto_increment,dep_name char(10),dep_comment char(60));create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default'male',dep_id int,foreign key(dep_id) references dep(id) on update cascade on delete cascade);insert into dep(dep_name,dep_comment) values('sb教学部','sb辅导学⽣学习,教授python课程'),('外交部','形象⼤使'),('nb技术部','nb技术能⼒有限部门');mysql>select*from dep;+----+------------------+------------------------------| id | dep_name | dep_comment |+----+------------------+------------------------------|1| sb教学部| sb辅导学⽣学习,教授python课程||2|外交部|形象⼤使||3| nb技术部| nb技术能⼒有限部门|+----+------------------+-------------------------------insert into emp(name,gender,dep_id) values('alex','male',1),('egon','male',2),('lxx','male',1),('wxx','male',1),('wenzhou','female',3);mysql>select*from emp;+----+------------------+--------+--------+| id | name | gender | dep_id |+----+------------------+--------+--------+|1| alex | male |1||2| egon | male |2||3| lxx | male |1||4| wxx | male |1||5| wenzhou | female |3|+----+------------------+--------+--------+# 同步删除mysql>delete from dep where id=1;mysql>select*from dep;+----+------------------+------------------| id | dep_name | dep_comment |+----+------------------+------------------|2|外交部|形象⼤使||3| nb技术部| nb技术能⼒有限部门|+----+------------------+------------------mysql>select*from emp;+----+------------------+--------+--------+| id | name | gender | dep_id |+----+------------------+--------+--------+|2| egon | male |2||5| wenzhou | female |3|+----+------------------+--------+--------+#同步更新mysql>update dep set id=200where id =2;mysql>select*from dep;+-----+------------------+----------------| id | dep_name | dep_comment |+-----+------------------+----------------|3| nb技术部| nb技术能⼒有限部||200|外交部|形象⼤使|+-----+------------------+----------------mysql>select*from emp;+----+------------------+--------+--------+| id | name | gender | dep_id |+----+------------------+--------+--------+|2| egon | male |200||5| wenzhou | female |3|+----+------------------+--------+--------+View Code10.72 多对多(foreign key)1、什么是多对多两张表之间是⼀个双向的多对⼀关系,称之为多对多2、如何实现?建⽴第三张表,该表中有⼀个字段是fk左表的id,还有⼀个字段是fk右表的idcreate table author(id int primary key auto_increment,name char(16));create table book(id int primary key auto_increment,bname char(16),price int);insert into author(name) values('egon'),('alex'),('wxx');mysql>select*from author;+----+------+| id | name |+----+------+|1| egon ||2| alex ||3| wxx |+----+------+insert into book(bname,price) values('python从⼊门到⼊⼟',200),('葵花宝典切割到精通',800),('九阴真经',500),('九阳神功',100);mysql>select*from book;+----+-----------------------------+-------+| id | bname | price |+----+-----------------------------+-------+|1| python从⼊门到⼊⼟|200||2|葵花宝典切割到精通|800||3|九阴真经|500||4|九阳神功|100|+----+-----------------------------+-------+create table author2book(id int primary key auto_increment,author_id int,book_id int,foreign key(author_id) references author(id) on update cascade on delete cascade, foreign key(book_id) references book(id) on update cascade on delete cascade); insert into author2book(author_id,book_id) values(1,3),(1,4),(2,2),(2,4),(3,1),(3,2),(3,3),(3,4);mysql>select*from author2book;+----+-----------+---------+| id | author_id | book_id |+----+-----------+---------+|1|1|3||2|1|4||3|2|2||4|2|4||5|3|1||6|3|2||7|3|3||8|3|4|+----+-----------+---------+10.73 ⼀对⼀(unique+foreign key)⼀对⼀:左表的⼀条记录唯⼀对应右表的⼀条记录,反之也⼀样create table customer( #先建被参照的表id int primary key auto_increment,name char(20) not null,qq char(10) not null,phone char(16) not null);create table student(id int primary key auto_increment,class_name char(20) not null,customer_id int unique, #该字段⼀定要是唯⼀的,⼀对⼀foreign key(customer_id) references customer(id) #外键的字段⼀定要保证unique on delete cascade on update cascade);insert into customer(name,qq,phone) values('李飞机','31811231',138********),('王⼤炮','123123123',152********),('守榴弹','283818181',1867141331),('吴坦克','283818181',1851143312),('赢⽕箭','888818181',1861243314),('战地雷','112312312',188********);mysql>select*from customer;+----+-----------+-----------+-------------+| id | name | qq | phone |+----+-----------+-----------+-------------+|1|李飞机|31811231|138********||2|王⼤炮|123123123|152********||3|守榴弹|283818181|1867141331||4|吴坦克|283818181|1851143312||5|赢⽕箭|888818181|1861243314||6|战地雷|112312312|188********|+----+-----------+-----------+-------------+insert into student(class_name,customer_id) values('python',3),('java',4),('c++',5);mysql>select*from student;+----+-------------+-------------+| id | class_name | customer_id |+----+-------------+-------------+|1| python |3||2| java |4||3| c++|5|+----+-------------+-------------+。
字段约束⽬录字段约束给主键添加约束,起到⾮空并且唯⼀的作⽤,主键指表⽰数据唯⼀性的字段,⼀张表中主键字段只有⼀个;字段约束/列约束 --> 约束: 限制主键约束主键主键约束:如果为⼀个列添加了主键约束,那么这个列就是主键,主键的特点是唯⼀且不能为空。
主键的作⽤: 作为⼀个唯⼀标识,唯⼀的表⽰⼀条表记录(作⽤类似于⼈的⾝份证号,可以唯⼀的表⽰⼀个⼈⼀样。
)关键字: primary key添加主键约束,例如将id设置为主键:create table stu(id int primary key,...);如果主键是数值类型,为了⽅便插⼊主键(并且保证插⼊数据时,主键不会因为重复⽽报错),可以设置⼀个主键⾃增策略。
主键⾃增主键⾃增策略是指:设置了⾃增策略的主键,可以在插⼊记录时,不给id赋值,只需要设置⼀个null值,数据库会⾃动为id分配⼀个值(AUTO_INCREMENT变量,默认从1开始,后⾯依次+1),这样既可以保证id是唯⼀的,也省去了设置id的⿇烦。
主键⾃增关键字: auto_increment例如: 将id主键设置为⾃增:create table stu(id int primary key auto_increment,...);⾮空约束⾮空约束:如果为⼀个列添加了⾮空约束,那么这个列的值就不能为空,但可以重复。
关键字: not null添加⾮空约束,例如为password添加⾮空约束:create table user(password varchar(50) not null,...);唯⼀约束唯⼀约束:如果为⼀个列添加了唯⼀约束,那么这个列的值就必须是唯⼀的(即不能重复),但可以为空。
关键字: unique添加唯⼀约束,例如为username添加唯⼀约束及⾮空约束:create table user(username varchar(50) unique not null,...);外键约束外键其实就是⽤于通知数据库两张表数据之间对应关系的这样⼀个列。
MySQL约束和数据类型约束条件约束条件就是在给字段加⼀些约束,使该字段存储的值更加符合我们的预期。
常⽤约束条件如下:UNSIGNED :⽆符号,值从0开始,⽆负数ZEROFILL:零填充,当数据的显⽰长度不够的时候,在数据前使⽤0填充⾄指定长度,字段会⾃动添加UNSIGNEDNOT NULL:⾮空约束,表⽰该字段的值不能为空DEFAULT:表⽰如果插⼊数据时没有给该字段赋值,那么就使⽤默认值PRIMARY KEY:主键约束,表⽰唯⼀标识,不能为空,且⼀个表只能有⼀个主键。
⼀般都是⽤来约束idAUTO_INCREMENT:⾃增长,只能⽤于数值列,⽽且配合索引使⽤,默认起始值从1开始,每次增长1UNIQUE KEY:唯⼀值,表⽰该字段下的值不能重复,null除外。
⽐如⾝份证号是⼀⼈⼀号的,⼀般都会⽤这个进⾏约束FOREIGN KEY:外键约束,某个表的字段是另⼀个表的主键,我们称这个字段为另⼀个表的外键。
⽬的是为了保证数据的完成性和唯⼀性,以及实现⼀对⼀或⼀对多关系MySQL数据类型MySQL⽀持多种类型的SQL数据类型:数值,⽇期和时间类型,字符串(字符和字节)类型,空间类型和 JSON数据类型等数据类型描述使⽤以下约定:M表⽰整数类型的最⼤显⽰宽度。
M表⽰整数类型的最⼤显⽰宽度。
对于浮点和定点类型, M是可以存储的总位数(精度)。
对于字符串类型,M是最⼤长度。
允许的最⼤值M取决于数据类型。
D适⽤于浮点和定点类型,并指⽰⼩数点后⾯的位数。
最⼤可能值为30,但不应⼤于 M-2。
[ ]表⽰类型定义的可选部分。
在MySQL中常⽤数据类型主要分为以下⼏类数值类型字符串类型⽇期时间类型1、数值类型数值类型包括整数型、浮点型、定点型1.1 整数型类型⼤⼩范围(有符号)范围(⽆符号)⽤途TINYINT 1 字节(-128,127)(0,255)⼩整数值SMALLINT 2 字节(-32 768,32 767)(0,65 535)⼤整数值MEDIUMINT 3 字节(-8 388 608,8 388 607)(0,16 777 215)⼤整数值INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)⼤整数值BIGINT8 字节(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极⼤整数值有符号表⽰数值可以为负数,⽆符号表⽰数值为⾮负数,如果不⼿动指定UNSIGNED,那么默认就是有符号的。
数据库字段的约束数据库中的约束我归纳了⼀下有⼏种据我所知道的列举出来数据库中的字段的约束很有哟个他可以对输⼊的内容及逆⾏⼀个规则为了防⽌以后忘了所以现在列举出来给⼤家和我⼀个参考1)主键约束(primary key)主键约束通常都是在id字段上使⽤的他⼜两个特点不能为空或不能重复,主键约束(primary key) 例如:create table 表名( uid number(20) primary key , uname varchar2(6) );2)⾮空约束(not null) ⾮空约束,就是保证⼀个字段不能为空,不能有空值存在,如果插⼊空值,则会报错。
3)唯⼀约束(unique) 如果想让某个字段唯⼀,则为它加上unique唯⼀约束,当插⼊了相同的值时会报错。
例如:create table 表名( uname varchar2(6) unique, uid number(10) primary keye );4)检查性约束(check (字段名 in (⼀个合法范围))) 使⽤检查性约束可以⽤来约束某个字段值的合法范围。
例如⽤1表⽰男,2表⽰⼥。
create table 表名( gender number(1) check (gender in(1,2)), );5)外键约束 外键约束⽤于两张表之间,⽤来保证关联数据的完整性。
例如订单和订单明细表,⼀对多关系。
创建订单表: create table 表名( order_id number(10), total_price number(10,2), ); 创建订单明细表: create table order_detail( detail_id number(10), order_id number(10),//在order表中是主键 item_name varchar2(10), quantity number(10), constraint order_detail_detail_id_pk primary key (detail_id), constraint order_detail_order_id_fk foreign key (order_id) referencs orders(order_id)|on deletecascade|on update cascade );6)⾃增(identity) identity⼀起使⽤的时候就会出现他可以去⾃动的增长不⽤你去⼈为的输⼊。