MySQL字段约束

MySQL字段约束

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_unique0表示索引中不能包含重复值(主键和唯一索引时该值为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版权协议,转载请附上原文出处链接和本声明。