MySQL支持的约束包括主键(primary key)约束、非空约束(not NULL)、检查约束(check)、默认值约束(default)、唯一性(unique)约束以及外键约束。
1.设置主键约束
(1)如果一个表的主键是单个字段,直接在该字段的后面加上"primary key"关键字,即可将该字段设置为主键约束。
mysql> create table student(student_no char(11) primary key);
Query OK, 0 rows affected (0.00 sec)
mysql> desc student;
+------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+-------+
| student_no | char(11) | NO | PRI | NULL | |
+------------+----------+------+-----+---------+-------+
1 row in set (0.03 sec)
(2)如果一个表的主键是多个组合字段:primary key (字段1,字段2)
mysql> create table time(t1 datetime ,t2 timestamp,primary key(t1,t2));
Query OK, 0 rows affected (0.02 sec)
mysql> desc time;
+-------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------------------+-----------------------------+
| t1 | datetime | NO | PRI | 0000-00-00 00:00:00 | |
| t2 | timestamp | NO | PRI | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+---------------------+-----------------------------+
2 rows in set (0.00 sec)
===================查看索引信息======================
mysql> show index from time\G
*************************** 1. row ***************************
Table: time
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: t1
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: time
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 2
Column_name: t2
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
字段名 | 说明 |
---|---|
Table | 表的名称 |
Non_unique | 0表示索引中不能包含重复值(主键和唯一索引时该值为0). 1表示索引中可以包含重复值 |
Key_name | 索引的名称 |
Seq_in_index | 索引中的字段序列号,1表示该字段是第一关键字,2表示该字段是第二关键字 |
Column_name | 哪个字段名被编入索引 |
Collation | 关键字是否排序,A表示排序,NULL表示不排序。若Index_comment值为BTREE 该值总为A;若为全文索引,该值为NULL |
Cardinality | 关键字值的离散程度,该值越大,越离散 |
Sub_part | 如果整个字段值被编入索引,则为NULL,如果字段的某个部分被编入索引,则值 为被编入索引的字符个数。 |
Packed | 索引的关键字是否被压缩。没有压缩则为NULL。 |
Null | 如果字段可以为NULL,则为YES,否则为NO。 |
Index_type | 索引的数据结构(BTREE,FULLTEXT,HASH,BTREE) |
Comment | 注释 |
2、非空约束
设置非空约束的字段,字段值不能为NULL值
字段名 数据类型 not null
mysql> create table st(student_name char(20) not null);
Query OK, 0 rows affected (0.01 sec)
mysql> desc st
-> ;
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| student_name | char(20) | NO | | NULL | |
+--------------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)
3、设置默认约束
设置某个字段的默认值 字段名 数据类型[其他约束条件] detault 默认值
mysql> create table st2(stu_no int default 60);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into st2 values();
Query OK, 1 row affected (0.00 sec)
mysql> select * from st2;
+--------+
| stu_no |
+--------+
| 60 |
+--------+
1 row in set (0.00 sec)
4、设置唯一性约束
若某个字段的值是唯一的不允许重复,则可以添加此约束限制。
字段名 数据类型 unique
mysql> create table st3(stu_no int unique);
Query OK, 0 rows affected (0.04 sec)
mysql> desc st3;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| stu_no | int(11) | YES | UNI | NULL | |
+--------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
5、外键约束
外键约束主要用于定义表和表的关系。表A外键字段的取值,要么是NULL,要么是来自B主键字段的取值(此时将表A称为表B的字表,表B称为表A的父表)。
在表A中设置外键的语法规则如下。
constraint 约束名 foreign key (表A字段名) references 表B(字段名) [on delete级联选项] [on update级联选项]
级联选项有4种取值,其意义如下。
(1)cascade:父表记录的删除(delete)或者修改(update)操作,会自动删除或修改子表中与之对应的记录。
(2)set null:父表记录的删除(delete)或者修改(update)操作,会将子表中与之对应记录的外键值自动设置为null值。
(3)no action:父表记录的删除(delete)或者修改(update)操作,如果子表存在与之对应的记录,那么删除或修改操作将失败。
(4)restrict:与no action功能相同,且为级联选项的默认值。
mysql> create table st(stu_no int primary key not null);
Query OK, 0 rows affected (0.01 sec)
mysql> create table st2(stu_no int,constraint stu_no_fk foreign key (stu_no) references st(stu_no));
Query OK, 0 rows affected (0.04 sec)
mysql> show index from st2\G
*************************** 1. row ***************************
Table: st2
Non_unique: 1
Key_name: stu_no_fk
Seq_in_index: 1
Column_name: stu_no
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
版权声明:本文为DoloresOOO原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。