mysql学习-MySQL约束详解01

MySQL约束详解

  • 1. MySQL主键(PRIMARY KEY)
  • 2. MySQL AUTO_INCREMENT:主键自增长
  • 3. MySQL外键约束(FOREIGN KEY)
  • 4. MySQL唯一约束(UNIQUE KEY)
  • 5. MySQL检查约束(CHECK)
  • 6. MySQL默认值(DEFAULT)
  • 7. MySQL非空约束(NOT NULL)
  • 8. MySQL查看表中的约束
  • 9. MySQL算术运算符
  • 10. MySQL逻辑运算符
  • 11. MySQL比较运算符
        • 1) 等于运算(=)
        • 2) 安全等于运算符(<=>)
        • 3) 不等于运算符(<> 或者 !=)
        • 4) 小于等于运算符(<=)
        • 5) 小于运算符(<)
        • 6) 大于等于运算符(>=)
        • 7) 大于运算符(>)
        • 8) IS NULL(ISNULL) 和 IS NOT NULL 运算符
        • 9) BETWEEN AND 运算符
  • 12. MySQL位运算符
          • 1)位或运算符 |
          • 位与运算符 &
          • 位异或运算符 ^
          • 位左移运算符 <<
          • 位右移运算符 >>
          • 位取反运算符 ~
  • 13. MySQL运算符的优先级
  • 14. MySQL IN和NOT IN用法详解

1. MySQL主键(PRIMARY KEY)

主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。

主键分为单字段主键和多字段联合主键,本节将分别讲解这两种主键约束的创建、修改和删除。

使用主键应注意以下几点:
每个表只能定义一个主键。

主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。
一个字段名只能在联合主键字段表中出现一次。

联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

在创建数据表时设置主键约束,既可以为表中的一个字段设置主键,也可以为表中多个字段设置联合主键。
但是不论使用哪种方法,在一个表中主键只能有一个。

1)设置单字段主键
在 CREATE TABLE 语句中,通过 PRIMARY KEY 关键字来指定主键。

在定义字段的同时指定主键,语法格式如下:

<字段名> <数据类型> PRIMARY KEY [默认值]

或者是在定义完所有字段之后指定主键,语法格式如下:

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

案例:

CREATE TABLE tb_a
 (
	 id INT(11),
	 name VARCHAR(25),
	 deptId INT(11),
	 salary FLOAT,
	 PRIMARY KEY(id)
 );

2)在创建表时设置联合主键
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。

比如,设置学生选课数据表时,使用学生编号做主键还是用课程编号做主键呢?如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选。显然,这两种情况都是不符合实际情况的。

实际上设计学生选课表,要限定的是一个学生只能选择同一课程一次。因此,学生编号和课程编号可以放在一起共同作为主键,这也就是联合主键了。

主键由多个字段联合组成,语法格式如下:

PRIMARY KEY [字段1,字段2,…,字段n]

案例:

注意:当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。

3)在修改表时添加主键约束
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。但是需要注意的是,设置成主键约束的字段中不允许有空值。

在修改数据表时添加主键约束的语法格式如下:

ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);

案例:

ALTER TABLE tb_a ADD PRIMARY KEY(id);

当在修改表时要设置表中某个字段的主键约束时,要确保设置成主键约束的字段中值不能够有重复的,并且要保证是非空的。否则,无法设置主键约束。

4)删除主键约束
当一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。

删除主键约束的语法格式如下所示:

alter table <数据表名> drop primary key;

案例:

alter table tb_a drop primary key;

2. MySQL AUTO_INCREMENT:主键自增长

在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。

通过给字段添加 AUTO_INCREMENT 属性来实现主键自增长。语法格式如下:
字段名 数据类型 AUTO_INCREMENT

默认情况下,AUTO_INCREMENT 的初始值是 1,每新增一条记录,字段值自动加 1。
一个表中只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
AUTO_INCREMENT 约束的字段必须具备 NOT NULL 属性。
AUTO_INCREMENT 约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
AUTO_INCREMENT 约束字段的最大值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效。

加上 AUTO_INCREMENT 约束条件后,字段中的每个值都是自动增加的。因此,这个字段不可能出现相同的值。通常情况下,AUTO_INCREMENT 都是作为 id 字段的约束条件,并且将 id 字段作为表的主键。

指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加。

案例:创建表 tb_student2,指定主键从 100 开始自增长

CREATE TABLE tb_student2 (
	 id INT NOT NULL AUTO_INCREMENT,
	 name VARCHAR(20) NOT NULL,
	 PRIMARY KEY(ID)
 )AUTO_INCREMENT=100;

3. MySQL外键约束(FOREIGN KEY)

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

定义外键时,需要遵守下列规则:
主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为主表定义主键。
主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
外键中列的数目必须和主表的主键中列的数目相同。
外键中列的数据类型必须和主表主键中对应列的数据类型相同。

在创建表时设置外键约束
在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]

案例:

create table tb_dept1
 (
 id int(11) primary key,
 name varchar(22) not null,
 location varchar(50)
 );
	
create table tb_emp6
 (
 id int(11) primary key,
 name varchar(25),
 deptid int(11),
 salary float,
 constraint fk_emp_dept1
 foreign key(deptid) references tb_dept1(id)
 );

注意:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如,两者都是 INT 类型,或者都是 CHAR 类型。如果不满足这样的要求,在创建从表时,就会出现“ERROR 1005(HY000): Can’t create table”错误。

在修改表时添加外键约束
外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。

在修改数据表时添加外键约束的语法格式如下:

alter table <数据表名> add constraint <外键名>
foreign key(<列名>) references <主表名> (<列名>);

4. MySQL唯一约束(UNIQUE KEY)

MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。

唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。

在创建表时设置唯一约束
唯一约束可以在创建表时直接设置,通常设置在除了主键以外的其它列上。

在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法格式如下:

<字段名> <数据类型> UNIQUE
create table tab2(
	id int(11) primary key,
	name varchar(55) unique,
	location varchar(55) default null comment '地址'
);
desc tab2;

在修改表时添加唯一约束
在修改表时添加唯一约束的语法格式为:

ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);

案例:

alter table tab2 add constraint unique(name);

删除唯一约束。
在 MySQL 中删除唯一约束的语法格式如下:

ALTER TABLE <表名> DROP INDEX <唯一约束名>;

案例:删除列 name 的的唯一约束。

alter table  tab2 drop index name;

5. MySQL检查约束(CHECK)

MySQL 检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。
设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。
选取设置检查约束的字段
检查约束使用 CHECK 关键字,具体的语法格式如下:

check  <表达式>

其中,“表达式”指的就是 SQL 表达式,用于指定需要检查的限定条件。

若将 CHECK 约束子句置于表中某个列的定义之后,则这种约束也称为基于列的 CHECK 约束。

在更新表数据的时候,系统会检查更新后的数据行是否满足 CHECK 约束中的限定条件。MySQL 可以使用简单的表达式来实现 CHECK 约束,也允许使用复杂的表达式作为限定条件,例如在限定条件中加入子查询。

注意:若将 CHECK 约束子句置于所有列的定义以及主键约束和外键定义之后,则这种约束也称为基于表的 CHECK 约束。该约束可以同时对表中多个列设置限定条件。

案例:

create table tab3(
	id int(11) primary key,
	name varchar(54),
	deptid int(11),
	salary float,
	check(salary > 0 and salary <100000),
	foreign key(deptid) references tab2(id)
);

在修改表时添加检查约束
如果一个表创建完成,可以通过修改表的方式为表添加检查约束。
修改表时设置检查约束的语法格式如下:

alter table tab3 add constraint <检查约束名> check(<检查约束>);

案例:

alter table tab3 add constraint check_id check(id>0);

删除检查约束
修改表删除检查约束的语法格式如下:

alter table <数据表名> drop constraint <检查约束名>;

案例:

alter table tab3 drop constraint check_id;

6. MySQL默认值(DEFAULT)

默认值(Default)的完整称呼是“默认值约束(Default Constraint)”,用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。

默认值约束通常用在已经设置了非空约束的列,这样能够防止数据表在录入数据时出现错误。

在创建表时设置默认值约束
创建表时可以使用 DEFAULT 关键字设置默认值约束,具体的语法格式如下:

<字段名> <数据类型> DEFAULT <默认值>;

其中,“默认值”为该字段设置的默认值,如果是字符类型的,要用单引号括起来。

在修改表时添加默认值约束
修改表时添加默认值约束的语法格式如下:

ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;

案例:

alter table tab3 
change column location varchar(50) default '天下第一村';

删除默认值约束
当一个表中的列不需要设置默认值时,就需要从表中将其删除。

修改表时删除默认值约束的语法格式如下:
语法:

alter table <表名> change column <字段名><字段名> <数据类型> default null;

案例:
修改表student中默认的地址位置,将地址默认值约束删除。

alter table student change column address address varchar(30) default null;

7. MySQL非空约束(NOT NULL)

MySQL 非空约束(NOT NULL)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。
在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空。

在创建表时设置非空约束
创建表时可以使用 NOT NULL 关键字设置非空约束,具体的语法格式如下:

<字段名> <数据类型> NOT NULL;

案例:

create table student_small(
id int(11) primary key,
name varchar(255) default  null comment '姓名',
address varchar (255) default '中国'
);

在修改表时添加非空约束
如果在创建表时忘记了为字段设置非空约束,也可以通过修改表进行非空约束的添加。

修改表时设置非空约束的语法格式如下:

ALTER TABLE <数据表名>
CHANGE COLUMN <字段名>
<字段名> <数据类型> NOT NULL;

案例:

alter table student_small change column address  address varchar(255) not null;

alter table student_small change column name name varchar(255) not null;

删除非空约束
语法:

ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;

案例:

alter table student_small change column name name varchar(255) null;

8. MySQL查看表中的约束

查看数据表中的约束语法格式如下:

SHOW CREATE TABLE <数据表名>;

9. MySQL算术运算符

对于取余运算,还可以使用 MOD(a,b) 函数,MOD(a,b) 相当于 a%b。

数学运算中,除数为 0 的除法是没有意义的。所以在除法运算和取余运算中,如果除数为 0,那么返回结果为 NULL.

10. MySQL逻辑运算符

逻辑非运算(NOT 或者 !)
NOT和!都是逻辑非运算符,返回和操作数相反的结果,具体语法规则为:
当操作数为 0(假)时,返回值为 1;
当操作数为非零值时,返回值为 0;
当操作数为 NULL 时,返回值为 NULL。

NOT 1+1和! 1+1的返回值不同,这是因为 NOT 与 ! 的优先级不同:
NOT 的优先级低于 +,因此NOT 1+1相当于NOT(1+1),先计算1+1,然后再进行 NOT 运算,由于操作数不为 0,因此NOT 1+1的结果是 0;
相反,! 的优先级别要高于 +,因此! 1+1相当于(!1)+1,先计算!1结果为 0,再加 1,最后结果为 1。

读者在使用运算符运算时,一定要注意运算符的优先级,如果不能确定计算顺序,最好使用括号,以保证运算结果的正确。

逻辑与运算符(AND 或者 &&)
AND 和 && 都是逻辑与运算符,具体语法规则为:
当所有操作数都为非零值并且不为 NULL 时,返回值为 1;
当一个或多个操作数为 0 时,返回值为 0;
操作数中有任何一个为 NULL 时,返回值为 NULL。

逻辑或运算符(OR 或者 ||)
OR 和 || 都是逻辑或运算符,具体语法规则为:
当两个操作数都为非 NULL 值时,如果有任意一个操作数为非零值,则返回值为 1,否则结果为 0;
当有一个操作数为 NULL 时,如果另一个操作数为非零值,则返回值为 1,否则结果为NULL;
假如两个操作数均为 NULL 时,则返回值为 NULL。

异或运算(XOR 运算符)
XOR 表示逻辑异或,具体语法规则为:
当任意一个操作数为 NULL 时,返回值为 NULL;
对于非 NULL 的操作数,如果两个操作数都是非 0 值或者都是 0 值,则返回值为 0;
如果一个为0值,另一个为非 0 值,返回值为 1。

11. MySQL比较运算符

1) 等于运算(=)

= 运算符用来比较两边的操作数是否相等,相等的话返回 1,不相等的话返回 0。具体的语法规则如下:
若有一个或两个操作数为 NULL,则比较运算的结果为 NULL。
若两个操作数都是字符串,则按照字符串进行比较。
若两个操作数均为整数,则按照整数进行比较。
若一个操作数为字符串,另一个操作数为数字,则 MySQL 可以自动将字符串转换为数字。

注意:NULL 不能用于 = 比较。

2) 安全等于运算符(<=>)

<=> 操作符和 = 操作符类似,不过 <=> 可以用来判断 NULL 值,具体语法规则为:
当两个操作数均为 NULL 时,其返回值为 1 而不为 NULL;
而当一个操作数为 NULL 时,其返回值为 0 而不为 NULL。

3) 不等于运算符(<> 或者 !=)

与 = 的作用相反,<> 和 != 用于判断数字、字符串、表达式是否不相等。对于 <> 和 !=,如果两侧操作数不相等,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。

4) 小于等于运算符(<=)

<= 是小于等于运算符,用来判断左边的操作数是否小于或者等于右边的操作数;如果小于或者等于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。

5) 小于运算符(<)

< 是小于运算符,用来判断左边的操作数是否小于右边的操作数;如果小于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。

6) 大于等于运算符(>=)

= 是大于等于运算符,用来判断左边的操作数是否大于或者等于右边的操作数;如果大于或者等于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。

7) 大于运算符(>)

是大于运算符,用来判断左边的操作数是否大于右边的操作数;如果大于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。

8) IS NULL(ISNULL) 和 IS NOT NULL 运算符

IS NULL 或 ISNULL 运算符用来检测一个值是否为 NULL,如果为 NULL,返回值为 1,否则返回值为 0。ISNULL 可以认为是 IS NULL 的简写,去掉了一个空格而已,两者的作用和用法都是完全相同的。

IS NOT NULL 运算符用来检测一个值是否为非 NULL,如果是非 NULL,返回值为 1,否则返回值为 0。

9) BETWEEN AND 运算符

BETWEEN AND 运算符用来判断表达式的值是否位于两个数之间,或者说是否位于某个范围内,它的语法格式如下:
expr BETWEEN min AND max

expr 表示要判断的表达式,min 表示最小值,max 表示最大值。如果 expr 大于等于 min 并且小于等于 max,那么返回值为 1,否则返回值为 0。

12. MySQL位运算符

所谓位运算,就是按照内存中的比特位(Bit)进行操作,这是计算机能够支持的最小单位的运算。程序中所有的数据在内存中都是以二进制形式存储的,位运算就是对这些二进制数据进行操作。

位运算一般用于操作整数,对整数进行位运算才有实际的意义。整数在内存中是以补码形式存储的, 正数的补码形式和原码形式相同,而负数的补码形式和它的原码形式是不一样的,这一点大家要特别注意;这意味着,对负数进行位运算时,操作的是它的补码,而不是它的原码
MySQL 中的整数字面量(常量整数,也就是直接书写出来的整数)默认以 8 个字节(Byte)来表示,也就是 64 位(Bit)。例如,5 的二进制形式为:

0000 0000 ... 0000 0101

省略号部分都是 0,101 前面总共有 61 个 0。
注意:为了方便大家阅读,本节在介绍正数的补码时,省略了前面的 0。

运算符 说明 使用形式 举例
& 位与 a & b 5 & 8
^ 位异或 a ^ b 5 ^ 8
~ 位取反 ~a ~5
<< 位左移 a << b 5 << 2,表示整数 5 按位左移 2 位
>> 位右移 a >> b 5 >> 2,表示整数 5 按位右移 2 位

位运算中的&、|、~和逻辑运算中的&&、||、!非常相似。

1)位或运算符 |

参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1结果为 1,0|0结果为0,1|0结果为1,这和逻辑运算中的||非常类似。

10 的补码为 1010,15 的补码为 1111,按位或运算之后,结果为 1111,即整数 15;9 的补码为 1001,4 的补码为 0100,2 的补码为 0010,按位或运算之后,结果为 111,即整数 15。

位与运算符 &

参与&运算的两个二进制位都为 1 时,结果就为 1,否则为 0。例如1|1结果为 1,0|0结果为 0,1|0结果为 0,这和逻辑运算中的&&非常类似。

位异或运算符 ^

参与^运算的两个二进制位不同时,结果为 1,相同时,结果为 0。例如1|1结果为 0,0|0结果为 0,1|0结果为1。

位左移运算符 <<

位左移是按指定值的补码形式进行左移,左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用 0 补齐。

位左移的语法格式为:
expr << n

其中,n 指定值 expr 要移位的位数,n 必须为非负数。

位右移运算符 >>

位右移是按指定值的补码形式进行右移,右移指定位数之后,右边低位的数值被移出并丢弃,左边高位空出的位置用 0 补齐。

位右移语法格式为:
expr >> n
其中,n 指定值 expr 要移位的位数,n 必须为非负数。
例 9

位取反运算符 ~

位取反是将参与运算的数据按对应的补码进行反转,也就是做 NOT 操作,即 1 取反后变 0,0 取反后变为 1。

13. MySQL运算符的优先级

优先级由低到高排列 运算符
1 =(赋值运算)、:=
2 II、OR
3 XOR
4 &&、AND
5 NOT
6 BETWEEN、CASE、WHEN、THEN、ELSE
7 =(比较运算)、<=>、>=、>、<=、<、<>、!=、 IS、LIKE、REGEXP、IN
8
9 &
10 <<、>>
11 -(减号)、+
12 *、/、%
13 ^
14 -(负号)、〜(位反转)
15 !

可以看出,不同运算符的优先级是不同的。一般情况下,级别高的运算符优先进行计算,如果级别相同,MySQL 按表达式的顺序从左到右依次计算。

另外,在无法确定优先级的情况下,可以使用圆括号“()”来改变优先级,并且这样会使计算过程更加清晰。

14. MySQL IN和NOT IN用法详解

MySQL 中的 IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。

NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中;如果不是,返回值为 1,否则返回值为 0。
IN 和 NOT IN 的语法格式如下:

expr IN ( value1, value2, value3 ... valueN )
expr NOT IN ( value1, value2, value3 ... valueN )

expr 表示要判断的表达式,value1, value2, value3 … valueN 表示列表中的值。MySQL 会将 expr 的值和列表中的值逐一对比。

IN 和 NOT IN 的返回值正好相反。

对空值 NULL 的处理
当 IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 1。
NOT IN 恰好相反,当 NOT IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 0。

你可能感兴趣的:(mysql)