mysql数据表约束
mysql数据表的约束
1.使用主键约束
主键又称主码,是表中一列或多列的组合,主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空,主键能够唯一标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。
主键两种类型:单字段主键和多字段联合主键
(1)单字段
两种语法:
a.定义列的同时指定主键:字段名 数据类型 primary key [默认值]
create table tb_name( id int(11) primary key, name char(25), age int(3), deptID int(11) ) engine=innodb default charset utf8;
b.定义完所有列之后指定主键: [constraint <约束名> primary key [字段名]]
create table tb_name( id int(11), name char(25), age int(3), deptID int(11), primary key (id) ) engine=innodb default charset utf8;
(2)多字段联合主键
定义万所有列之后指定:
primary key (字段1,字段2...字段n)
create table tb_name1( id int(11), name char(25), age int(3), deptID int(11), primary key (id,deptID) ) engine=innodb default charset utf8;
2.使用外键约束
外键用来在两个表的数据之间建立链接,它可以是一列或者多列,一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键:首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键,外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。
如:部门表tb_dept的主键是id,在员工表的tb_emp中有一个键deptId与这个id关联。
主表(父表):对应两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。
从表(子表):对应两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
创建外键的语法:
constraint 外键名 foreign key (字段名[,字段2...]) references 主表名(主键列1 [,主键列2...]) constraint 外键名 foreign key (本数据表字段名[,字段2...]) references 另外一个数据表名(主键列1 [,主键列2...])
实例1-一对一:创建班级和学生表
create table class( cid int(11) auto_increment primary key, caption char(12) not null ) engine=innodb default charset utf8; create table student( sid int(11) not null auto_increment primary key, sname char(12) not null, gender char(3) not null, class_id int(11), constraint fk_student_class foreign key (class_id) references class(cid) ) engine=innodb default charset utf8;
实例2-一对多:
用户表和部门表 用户: 1 felix 1 2 alina 2 3 allen 3 部门表: 1 IT 2 CSO 3 MT create table user( id int(10) auto_increment primary key, sname char(25) not null, gender char(10) not null ) engine=innodb default charset utf8; insert into user(sname,gender) values ('felix','男'); insert into user(sname,gender) values ('mission','女'); insert into user(sname,gender) values ('allen','女'); insert into user(sname,gender) values ('candy','女'); insert into user(sname,gender) values ('alina','女'); create table log( id int(10) auto_increment primary key, mname int(10) not null, fname int(10) not null, constraint fk_user_log1 foreign key (mname) references user (id), constraint fk_user_log foreign key (fname) references user (id) ) engine=innodb default charset utf8; insert into log(mname,fname) values ('1','3'); insert into log(mname,fname) values ('1','4'); insert into log(mname,fname) values ('3','4'); insert into log(mname,fname) values ('2','3'); insert into log(mname,fname) values ('2','5');
实例3-多对多:
用户表 主机表 用户主机关系表 create table user( id int(10) auto_increment primary key, sname char(25) not null, gender char(10) not null ) engine=innodb default charset utf8; create table host( id int(10) auto_increment primary key, host char(25) not null ) engine=innodb default charset utf8; insert into host(host) values ('cchncqsrvfs01'); insert into host(host) values ('cchncqsrvfs02'); insert into host(host) values ('cchncqsrvfs03'); create table useinfo( id int(10) auto_increment primary key, nameid int(10) not null, hostid int(10) not null, unique uq_name_host (nameid,hostid), constraint fk_userinfo_user foreign key (nameid) references user (id), constraint fk_userinfo_host foreign key (hostid) references host (id) ) engine=innodb default charset utf8;
3.使用非空约束
非空约束(Not Null Constraint) 指字段的值不能为空,对于使用了非空约束的字典,如果用户在增加数据时没有指定值,数据库系统就会报错。
非空约束语法:
字段名 数据类型 not null
create table class( cid int(11) auto_increment primary key, caption char(12) not null ) engine=innodb default charset utf8;
4.使用唯一性约束
唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值,唯一约束可以确保一列或者几列不出现重复值。
唯一性约束语法:
字段名 数据类型 unique
create table class( cid int(11) auto_increment primary key, caption char(12) not null unique ) engine=innodb default charset utf8;
unique和primary key 的区别:一个表中可以有多个字段声明为unique,但只能有一个primary key声明,声明为primary key的列不允许空值,但是声明为unique的字段允许空值的存在。
5.使用默认约束
默认约束(Default Constraint)指定某列的默认值。如果男性同学较多,性别就可以默认为'男',如果插入一条新的记录时没有为这个字段赋值,那么系统就自动为这个字段赋值为'男'。
默认约束语法:
字段名 数据类型 default 默认值
create table student1( sid int not null auto_increment primary key, sname char(12), gender char(3) default 'boy', class_id int ) engine=innodb default charset utf8;
6.设置表的属性值自动增加
在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的主键值,可以通过为表的主键增加 auto_increment 关键字来实现。
默认的在mysql中auto_increment的初始值为1。一个表中只能有一个字段使用auto_increment约束,且该字典必须为主键的一部分。
约束字段可以是任何整数类型(tinyint,smallint,int,bigint)。
自动增加语法:
字段名 数据类型 auto_increment
create table student1( sid int not null auto_increment primary key, sname char(12), gender char(3) default 'boy', class_id int ) engine=innodb default charset utf8;
通过show create tables 表名 \G; 查看创建表的命令和数据引擎、自增的值等,可以修改下次插入数据的自增值,
alter table 表名 auto_increment=20;
mysql> show create table student \G; *************************** 1. row *************************** Table: student Create Table: CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` char(12) DEFAULT NULL, `gender` char(3) DEFAULT NULL, `class_id` int(11) DEFAULT NULL, PRIMARY KEY (`sid`), KEY `fk_student_class` (`class_id`), CONSTRAINT `fk_student_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`ci d`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) ERROR: No query specified mysql> alter table student auto_increment=20; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table student \G; *************************** 1. row *************************** Table: student Create Table: CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` char(12) DEFAULT NULL, `gender` char(3) DEFAULT NULL, `class_id` int(11) DEFAULT NULL, PRIMARY KEY (`sid`), KEY `fk_student_class` (`class_id`), CONSTRAINT `fk_student_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`ci d`) ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) ERROR: No query specified mysql>
修改已存在表名的默认值:(下一条记录的ID号)
desc 表名; show create 表名 \G; alter table 表名 auto_increment=20; 修改自增的ID,即下一条数据的ID 从20开始 mysql> show create table student \G; *************************** 1. row *************************** Table: student Create Table: CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` char(12) DEFAULT NULL, `gender` char(3) DEFAULT NULL, `class_id` int(11) DEFAULT NULL, PRIMARY KEY (`sid`), KEY `fk_student_class` (`class_id`), CONSTRAINT `fk_student_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`ci d`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql> alter table student auto_increment=20; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table student \G; *************************** 1. row *************************** Table: student Create Table: CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` char(12) DEFAULT NULL, `gender` char(3) DEFAULT NULL, `class_id` int(11) DEFAULT NULL, PRIMARY KEY (`sid`), KEY `fk_student_class` (`class_id`), CONSTRAINT `fk_student_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`ci d`) ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
设置自增的步长:
基于会话级别: show session variables like 'auto_inc%'; 查看全局变量 set session auto_increment_increment=2; 设置会话级别 步长(关闭当前连接的客户端或者重新开的客户端步长还是1) set session auto_increment_offset=10; 设置起始值 基于全局级别: show global variables like 'auto_inc%'; 查看全局变量 set global auto_increment_increment=2; 设置会话级别 步长(关闭当前连接的客户端或者重新开的客户端步长还是1) set global auto_increment_offset=10; 设置起始值
mysql> show session variables like 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set, 1 warning (0.00 sec) mysql> set session auto_increment_increment=2; Query OK, 0 rows affected (0.00 sec) mysql> show session variables like 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 2 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set, 1 warning (0.01 sec) mysql> set session auto_increment_offset=10; Query OK, 0 rows affected (0.00 sec) mysql> show session variables like 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 2 | | auto_increment_offset | 10 | +--------------------------+-------+ 2 rows in set, 1 warning (0.01 sec)