MySQL之表的約束(主鍵、外鍵、唯一鍵、自增長、列描述、默認值、空屬性)

1.表的約束

真正約束字段的是數據類型,但是數據類型約束很單一,需要一些格外的約束,更好的保證數據的合法性,比如有一個字段是身份證號,要求是唯一的。
表的約束有很多,主要學習以下幾種:
null/not null;
default;
comment;
primary key;
auto_increment;
unique key;

1.1空屬性null/not null
1)null:字段爲空(默認的)
2).not null:字段不爲空
案例:創建一張班級表,包含班級名和班級所在教室(如果沒有班級名,就不知道你所在班級;如果沒有教室名字,就不知道你在哪上課)

mysql> create table myclass(
    -> class_name varchar(10) not null,
    -> class_room varchar(10) not null);

mysql> desc myclass;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(10) | NO   |     | NULL    |       |
| class_room | varchar(10) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

//插入數據時,沒有給教室數據,所以插入失敗
mysql> insert into myclass(class_name) values('class1');
ERROR 1364 (HY000): Field 'class_room' doesn't have a default value

1.2默認值default
默認值:某一種數據會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實數據的時候,用戶可以選擇性的使用默認值。

mysql> create table tt10(
    -> name varchar(20) not null,
    -> age tinyint unsigned default 0,
    -> sex char(2) default '男');

mysql> desc tt10;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name  | varchar(20)         | NO   |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | 0       |       |
| sex   | char(2)             | YES  |     | 男      |       |
+-------+---------------------+------+-----+---------+-------+

數據在插入的時候不給該字段賦值,就是用定義好的默認值

mysql> insert into tt10(name) values('zhangsan');
mysql> select * from tt10;
+----------+------+------+
| name     | age  | sex  |
+----------+------+------+
| zhangsan |    0 | 男   |
+----------+------+------+

1.3列描述commet
comment:備註,專門用來描述字段

mysql> create table tt11(
    -> name varchar(20) not null comment'姓名',
    -> age tinyint unsigned default 0 comment '年齡',
    -> sex char(2)default '男' comment '性別'
    -> );

可以通過show查看註釋的列信息

mysql> show create table tt11;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                       |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tt11  | CREATE TABLE `tt11` (
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `age` tinyint(3) unsigned DEFAULT '0' COMMENT '年齡',
  `sex` char(2) DEFAULT '男' COMMENT '性別'
) ENGINE=InnoDB DEFAULT CHARSET=gbk        |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1.4主鍵primary key
I.一個主鍵
特點:唯一,不能重複,不能爲空,一般在整型字段列上定義

create table tt12(
    -> id int primary key,
    -> name varchar(10));
或create table tt13(
    -> id int,
    -> name varchar(10),
    -> primary key(id));
mysql> desc tt12;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

key中的PRI表示該字段是主鍵

II.複合主鍵

create table tt13(
    -> id int,
    -> name varchar(10),
    -> primary key(id,name));

mysql> desc tt13;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | NO   | PRI | NULL    |       |
+-------+-------------+------+-----+---------+-------+

III.表已建好,再添加主鍵

alter table 表名 add primary key(字段列表)
  • 主鍵約束:主鍵對應的字段不可以重複,一旦重複,操作失敗。
mysql> insert into tt13 values(1, 'aaa');
Query OK, 1 row affected (0.01 sec)
//插入相同數據時,無法插入
mysql> insert into tt13 values(1, 'aaa');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
  • 刪除主鍵
   alter table table_name drop primary key
mysql> alter table tt13 drop primary key;
mysql> desc tt13;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(10) unsigned | NO   |     | NULL    |       |
| name  | varchar(20)      | NO   |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+

1.5自增長

  • auto_increment:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值。通常和主鍵搭配使用,作爲邏輯主鍵。
  • 特點:一張表最多隻能有一個自增長;自增長字段必須是整數;任何一個字段要做自增長,前提是本身就是一個索引(key一欄有值)
//建表
mysql> create table tt2(
    -> id int unsigned primary key auto_increment,
    -> name varchar(10) not null default '');
//插入a    
mysql> insert into tt2(name) values('a');
//插入b
mysql> insert into tt2(name) values('b');
//查看錶內容
mysql> select * from tt2;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
+----+------+

1.6唯一鍵UNIQUE
一張表中往往有很多字段需要唯一性,數據不能重複,但是一張表中只能有一個主鍵;唯一鍵就可以解決表中有多個字段需要唯一性性約束的問題。
一張表可以有多個唯一鍵約束,而且可以爲空

create table tt16(
    -> id int primary key,
    -> name varchar(10) unique);
mysql> desc tt16;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+

1.7外鍵
外鍵用於定義主表和從表之間的關係:外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當定義外鍵後,要求外鍵列數據必須在主表的主鍵列存在或爲null。

foreign key (字段名) references 主表(列)

根據案例學習外鍵的用法

  • 先創建主表
mysql> create table myclass(
    -> id int  primary key,
    -> name varchar(30) not null comment '班級名');
  • 再創建從表
mysql> create table stu(
    -> id int primary key,
    -> name varchar(30) not null comment'學生名',
    -> class_id int,
    -> foreign key(class_id) references myclass(id))
    -> ;
  • 正常插入數據
mysql> insert into myclass values(10,'軟工01班'),(20,'計科02班');
mysql> insert into stu values(100,'張三',10),(101,'李四',20);
//查看兩張表
mysql> select * from myclass;
+----+-------------+
| id | name        |
+----+-------------+
| 10 | 軟工01班    |
| 20 | 計科02班    |
+----+-------------+

mysql> select * from stu;
+-----+--------+----------+
| id  | name   | class_id |
+-----+--------+----------+
| 100 | 張三   |       10 |
| 101 | 李四   |       20 |
+-----+--------+----------+
  • 插入一個班級號爲30的學生,因爲沒有30這個班級,所以無法插入
mysql> insert into stu values(102,'王五',30);
ERROR 1452 (23000): Cannot add or update a child row: 
a foreign key constraint fails (`test1`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `myclass` (`id`))
  • 插入班級id爲null(即新來一名學生,還沒有分配班級)
mysql> insert into stu values(102,'趙六',null);
mysql> select * from stu;
+-----+--------+----------+
| id  | name   | class_id |
+-----+--------+----------+
| 100 | 張三   |       10 |
| 101 | 李四   |       20 |
| 102 | 趙六   |     NULL |
+-----+--------+----------+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章