数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据可以正确反应实际状况。
数据的完整性是指数据的可靠性和准确性,数据完整性类型有四种:
A、实体完整性:实体的完整性强制表的标识符列或主键的完整性(经过惟一约束,主键约束或标识列属性)。
B、域完整性:限制类型(数据类型),格式(经过检查约束和规则),可能值范围(经过外键约束,检查约束,默认值定义,非空约束和规则)。
C、引用完整性:在删除和输入记录时,引用完整性保持表之间已定义的关系。引用完整性确保键值在全部表中一致,不能引用不存在的值.若是一个键。
D、自定义完整性:用户本身定义的业务规则,好比使用触发器实现自定义业务规则。数据库
MySQL不支持Check约束,虽然能够在列上添加check约束,但不起做用。ide
实体完整性的实现有两种方式:
A、主键约束:一张表只能有一列设置主键,值必须惟一,不容许为空,innoDB存储引擎,主键就是索引。
B、惟一值约束:一张表能够有多个列添加惟一值约束,一直容许一条记录为空值。
实体完整性,由主键和惟一性约束来实现,确保表中记录有一列惟一标识。主键又分为Primary key 和AUTO_INCREMENT PRIMARY KEY两种。函数
MySQL的主键名老是PRIMARY, 当建立主键约束时,若是表的存储引擎是innoDB,系统默认会在所在的列和列组合上创建对应的惟一索引。
主键约束至关于惟一约束与非空约束的组合,主键约束列不容许重复,也不容许出现空值;多列组合的主键约束,列都不容许为空值,而且组合的值不容许重复。每一个表最多只容许一个主键,创建主键约束能够在列级别建立,也能够在表级别上建立。
A、建立表时指定主键
建立表时指定主键的方式一:3d
create table product ( productID int PRIMARY KEY, pName VARCHAR(10), price DOUBLE )ENGINE=MyISAM default CHARSET=utf8;
建立表时指定主键的方式二:rest
create table product ( productID int, pName VARCHAR(10), price DOUBLE, CONSTRAINT pk_s_productID PRIMARY KEY(productID) )ENGINE=MyISAM default CHARSET=utf8;
在指定主键的表中插入记录时,不容许插入重复的ID,若是不指定主键的值,默认为0。
MyISAM类型的存储引擎不会在主键列上建立索引,表中记录的存储顺序与插入顺序相同。
InnoDB存储引擎会自动在主键列上建立索引,插入的记录会根据主键的值的顺序排放。alter table product ENGINE=InnoDB;
B、增长主键alter table TStudent add primary key(studentid);
C、删除主键alter table TStudent drop primary key;
code
AUTO_INCREMENT PRIMARY KEY
若是不指定主键值,会自动在现有主键值的最大值上自动增长1做为新记录的主键,主键值默认从1开始。能够在数据数据类型整数型的列上添加自增主键。
A、建立表时指定自增自增列对象
create table product ( productID int PRIMARY KEY AUTO_INCREMENT not NULL, pName VARCHAR(10), price DOUBLE )ENGINE=MyISAM default CHARSET=utf8;
B、为现有的表指定自增列alter table TStudent modify column studentID int PRIMARY KEY AUTO_INCREMENT;
blog
C、删除表中自增列alter table TStudent modify column studentID int not NULL;
删除自增列,仍然时主键,可是没有自增加功能索引
使用表的两列或多列建立主键。
A、建立表时指定复合主键rem
create table student ( studentID int, id INT, sname VARCHAR(10), score int, PRIMARY KEY(studentid,id) )ENGINE=MyISAM default CHARSET=utf8;
B、给表增长复合主键alter table student add PRIMARY KEY(sudentID,id);
C、删除复合主键alter table student drop PRIMARY KEY;
UNIQUE KEY,惟一约束,指定某列和几列组合的数据不能重复。
A、建立表时指定惟一性约束
create table score (sname VARCHAR(10) UNIQUE, score int not NULL );
B、给现有列增长惟一性约束alter table score add CONSTRAINT uc_sname UNIQUE(sname);
若是表中现有记录有重复值,不容许添加惟一性约束。能够经过聚合函数,查找有重复值的记录,删除,再建立惟一性约束。
C、建立复合惟一性约束
create table student ( studentID int, id INT, sname VARCHAR(10), score int, CONSTRAINT uc_id UNIQUE(studentID, id) )ENGINE=MyISAM default CHARSET=utf8;
D、删除列的惟一性约束alter table score drop index uc_sname;
在表中插入一条新的记录时,若是没有为该字段赋值,那么数据库系统会自动为该字段赋一条默认值。
create table st ( sid INT not null primary key auto_increment, sname varchar(10), subject varchar(20) default '软件工程', entertime TIMESTAMP default now() );
给表中一列添加默认值约束:alter table st modify column subject VARCHAR(20) default '计算机科学与技术';
删除表中一列的默认值约束:alter table st modify column subject VARCHAR(20) default NULL;
非空约束用于确保当前列的值不为空值,非空约束只能出如今表对象的列上。
Null类型特征: 全部的类型的值均可以是null,包括int、float等数据类型 空字符串是不等于NULL,0也不等于NULL。
A、建立表时给列指定非空约束
create table score (sname VARCHAR(10) not NULL, score int not NULL );
B、给指定列指定非空约束alter table score modify column score int not NULL;
C、删除非空约束alter table score modify column score int;
check关键字,在插入新行或者更改已有行时才起做用,做用是阻止不知足条件的值进入该列,对null值无效,由于插入null就至关于没有插入。一个列可有多个check。
age int check(age between 10 and 20);
目前MySQL不支持check约束,微软MSSQL支持Check约束,但建立表时能够指定Check约束,但不起做用。
MySQL参照完整性通常是经过MySQL外键(foreign key)实现的。
外键(仅innoDB支持)所引用表的列必须是主键。
外键声明包括三个部分:
A、哪一个列或列组合是外键
B、指定外键参照的表和列
C、参照动做[cascade(级联操做),restrict(拒绝操做),set null(设为空),no action,set default]。
若是外键约束指定了参照动做,主表记录作修改,删除,从表引用的列会作相应修改,或不修改,拒绝修改或设置为默认值。
引用表的列名必须是主键,且在删除引用表时必须删除引用关系或者删除当前表。
建立两张表,学生表student和成绩表score,成绩表的sid列的取值参照学生表(学生表student的sid列设置为主键,且表的存储引擎为innodb,成绩表score的存储引擎也必须设置为innodb)。
create table student ( sid int not null primary key, sname varchar(20) ) engine=innodb; create table score ( sid int not null, mark INT, constraint score_fk FOREIGN KEY (sid) references student(sid) on delete cascade on update cascade ) engine=innodb;
在学生表插入一条记录insert into student values (1,'孙悟空')
在成绩表插入一条记录,学号是1,成功。insert into score values (1,98)
在成绩表插入一条记录,学号是2,失败。insert into score values (2,88)
在学生表插入学号是2的一条记录insert into student values (2,'唐僧')
再在成绩表插入一条学号是2的记录,成功,证实外键参照成功。insert into score values (2,88);
ALTER TABLE
scoreDROP FOREIGN KEY
score_fk;
ALTER TABLE
scoreADD CONSTRAINT
score_fk2FOREIGN KEY (
sid) REFERENCES
student(
sid);
在score表建立的参照完整性,删除动做和更新动做的参照动做选择了cascade(级联操做),当学生表的sid更新时,分数表score的相应的sid也会更新,当学生被删除,分数表对应的sid的记录也会自动删除。
更新学生表学号是1的学生的学号为10update student set sid=10 where sid=1
查当作绩表,能够看到之前学号是1的已经变成了10select * from score
删除学生表学号是2的学生delete from student where sid=2
能够看到成绩表,该学生的成绩已经级联删除select * from score
级联动做设置为NO ACTION,若是子表中有匹配的记录,则不容许对父表对应候选键进行update/delete操做。
Restrict动做同no action,都是当即检查外键约束。
将参照动做设置为no action,若是成绩表score有该学生sid,将不能更改学生表student表的学生sid列,也不能删除该学生。除非你先删除该学生的成绩,再删除该学生。
删除score表的外键约束ALTER TABLE
scoreDROP FOREIGN KEY
score_fk;
增长score表的sid列外键约束
ALTER TABLE `score` ADD CONSTRAINT `score_fk` FOREIGN KEY (`sid`) REFERENCES `student` (`sid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
更新学号是10的学生的学号,失败update student set sid=11 where sid=10
删除学号是10的学生,失败delete from student where sid=10
须要先删除该学生成绩表中的记录,再删除该学生。
delete from student where sid=10 delete from score where sid=10;
在父表上update/delete记录时,将子表上匹配记录的列设为null ,要注意子表的外键列不能为not null。
删除成绩表的外键约束ALTER TABLE
scoreDROP FOREIGN KEY
score_fk;
增长成绩表的sid列外键约束,参照动做为set nullALTER TABLE
scoreADD CONSTRAINT
score_fkFOREIGN KEY (
sid) REFERENCES
student(
sid) ON DELETE SET NULL ON UPDATE SET NULL;
修改为绩表的sid列默认值为NULL
ALTER TABLE `score` MODIFY COLUMN `sid` INTEGER(11) DEFAULT NULL; insert into student values (1,'孙悟空') insert into student values (2,'猪八戒') insert into score values (1,98) insert into score values (2,88)
删除学生表中学号1的学生delete from student where sid=1
查当作绩表,成绩表中学号为1的列为NULLselect * from score