MySQL之完整性约束
Posted 进击的小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之完整性约束相关的知识,希望对你有一定的参考价值。
一 介绍
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
1 1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值 2 2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 3 sex enum(‘male‘,‘female‘) not null default ‘male‘ 4 age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20 5 3. 是否是key 6 主键 primary key 7 外键 foreign key 8 索引 (index,unique...)
2、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(11) | 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(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+ mysql> insert into t2 values(); #不能插入空 ERROR 1364 (HY000): Field ‘id‘ doesn‘t have a default value ==================default==================== #设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值 mysql> create table t3(id int default 1); mysql> alter table t3 modify id int not null default 1; ==================综合练习==================== mysql> create table student( -> name varchar(20) not null, -> age int(3) unsigned not null default 18, -> sex enum(‘male‘,‘female‘) default ‘male‘, -> hobby set(‘play‘,‘study‘,‘read‘,‘music‘) default ‘play,music‘ -> ); mysql> desc student; +-------+------------------------------------+------+-----+------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------------------------+------+-----+------------+-------+ | name | varchar(20) | NO | | NULL | | | age | int(3) unsigned | NO | | 18 | | | sex | enum(‘male‘,‘female‘) | YES | | male | | | hobby | set(‘play‘,‘study‘,‘read‘,‘music‘) | YES | | play,music | | +-------+------------------------------------+------+-----+------------+-------+ mysql> insert into student(name) values(‘egon‘); mysql> select * from student; +------+-----+------+------------+ | name | age | sex | hobby | +------+-----+------+------------+ | egon | 18 | male | play,music | +------+-----+------+------------+ 验证
3、unique
作用:限制字段的值唯一
#单列唯一 create table t1(id int nnique,name char(16)); #联合唯一 create table server(id int nuique,ip char(15),port int,unique(ip,port));
4、primary key
primary key 单从约束的角度去看,就等同于not null unique
强调;
1、一张表中必须有,并且只能有一个主键
2、一张表中都应该有一个id字段,而且应该把id字段做成主键
1 ============单列做主键=============== 2 #方法一:not null+unique 3 create table department1( 4 id int not null unique, #主键 5 name varchar(20) not null unique, 6 comment varchar(100) 7 ); 8 9 mysql> desc department1; 10 +---------+--------------+------+-----+---------+-------+ 11 | Field | Type | Null | Key | Default | Extra | 12 +---------+--------------+------+-----+---------+-------+ 13 | id | int(11) | NO | PRI | NULL | | 14 | name | varchar(20) | NO | UNI | NULL | | 15 | comment | varchar(100) | YES | | NULL | | 16 +---------+--------------+------+-----+---------+-------+ 17 rows in set (0.01 sec) 18 19 #方法二:在某一个字段后用primary key 20 create table department2( 21 id int primary key, #主键 22 name varchar(20), 23 comment varchar(100) 24 ); 25 26 mysql> desc department2; 27 +---------+--------------+------+-----+---------+-------+ 28 | Field | Type | Null | Key | Default | Extra | 29 +---------+--------------+------+-----+---------+-------+ 30 | id | int(11) | NO | PRI | NULL | | 31 | name | varchar(20) | YES | | NULL | | 32 | comment | varchar(100) | YES | | NULL | | 33 +---------+--------------+------+-----+---------+-------+ 34 rows in set (0.00 sec) 35 36 #方法三:在所有字段后单独定义primary key 37 create table department3( 38 id int, 39 name varchar(20), 40 comment varchar(100), 41 constraint pk_name primary key(id); #创建主键并为其命名pk_name 42 43 mysql> desc department3; 44 +---------+--------------+------+-----+---------+-------+ 45 | Field | Type | Null | Key | Default | Extra | 46 +---------+--------------+------+-----+---------+-------+ 47 | id | int(11) | NO | PRI | NULL | | 48 | name | varchar(20) | YES | | NULL | | 49 | comment | varchar(100) | YES | | NULL | | 50 +---------+--------------+------+-----+---------+-------+ 51 rows in set (0.01 sec) 52 53 单列主键
create table t19( ip char(15), port int, primary key(ip,port) );
5、auto_increment
束字段为自动增长,被约束的字段必须同时被key约束
create table t20( id int primary key auto_increment, name char(16) )engine=innodb; # auto_increment注意点: 1、通常与primary key连用,而且通常是给id字段加 2、auto_incremnt只能给被定义成key(unique key,primary key)的字段加
以上是关于MySQL之完整性约束的主要内容,如果未能解决你的问题,请参考以下文章