Mysql學習筆記#6-約束
約束
主鍵約束
它能夠唯一確定一張表中的一條記錄,也就是我們通過給某個欄位新增約束,就可以使得該欄位不重複且不為空
create table user(
id int primary key,
name varchar(20)
);
insert into user values(1,'zhangsan');
Query OK,1 row affected(0.17 sec)
insert into user values(1,'zhangsan');
ERROR 1062 (23000):Duplicate entry '1' for key 'primary'
(因為id為主鍵約束,所以不能再新增)
insert into user values(2,'zhangsan');
Query OK,1 row affected(0.13 sec)
insert into user values(NULL,'zhangsan');
ERROR 1048 (23000):Column 'id' can not be null
主鍵約束-聯合主鍵
只要聯合的主鍵值加起來不重複就可以,但任何欄位都不能為空
create table user2(
id int,
name varchar(20)
password varchar(20)
primary key(id,name)
);
insert into user2 values(1,'zhangsan',123);
Query OK,1 row affected(0.13 sec)
insert into user2 values(2,'zhangsan',123);
Query OK,1 row affected(0.10 sec)
insert into user2 values(1,'lisi',123);
Query OK,1 row affected(0.12 sec)
主鍵約束-建表後的新增與刪除
如果建立表的時候,忘記建立主鍵約束了,該怎麼辦
create table user4(
id int,
name varchar(20)
);
新增
alter table user4 add primary key(id);
刪除
alter table user4 drop primary key;
修改
alter table user4 modify id int primary key;
自增約束
自增約束有自動管控的作用
create table user3(
id int primary key auto_increment
name varchar(20)
);
insert into user3 (name) values('zhangsan')
Query OK,1 row affected (0.14 sec)
(自動將zhagnsan的id設定為1)
外來鍵約束
涉及到兩個表:父表,子表(主表,副表)
- 班級
create table classes(
id int primary key,
name varchar(20)
);
- 學生
create table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
);
desc classes;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
desc students;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| class_id | int | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+-------+
insert into classes values(1,'一班');
insert into classes values(2,'二班');
insert into classes values(3,'三班');
insert into classes values(4,'四班');
insert into students values(1001,'sangsan',1);
insert into students values(1002,'sangsan',2);
insert into students values(1003,'sangsan',3);
insert into students values(1004,'sangsan',4);
insert into students values(1005,'lisi',5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (study
.students
, CONSTRAINT students_ibfk_1
FOREIGN KEY (class_id
) REFERENCES classes
(id
))
結論
- 主表 classes 中沒有的資料值,在副表中,不可以被引用。
- 主表中的記錄被副表引用時,是不可以被刪除的。
delete from classes where id=4;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (study
.students
, CONSTRAINTstudents_ibfk_1
FOREIGN KEY (class_id
) REFERENCESclasses
(id
))
唯一約束
約束脩飾的欄位的值不可以重複
create table user5(
id int,
name varchar(20),
unique(name)
);
insert into user5 values(1,'zhangsan');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'name'
新增唯一約束
alter table user5 add unique(name);
alter table user5 modify name varchar(20) unique;
直接在欄位後面修飾
create table user6(
id int,
name varchar(20) unique
)
如何刪除唯一約束
alter table user6 drop index name;
多個唯一約束
修飾的欄位組合在一起不重複,類似聯合主鍵
create table user7(
id int,
name varchar(20),
unique(id,name)
)
非空約束
修飾的欄位不能為空 NULL
create table user9(
id int,
name varchar(20) not null
);
insert into user9 (id) values(1);
ERROR 1364 (HY000): Field 'name' doesn't have a default value
insert into user9 (id) values(1,'zhangsan');
Query OK,1 row affected (0.14 sec)
insert into user9 (name) values('lisi')
Query OK,1 row affected (0.12 sec)
預設約束
當插入欄位值的時候,如果沒有傳值,就會使用預設值
create table user10(
id int,
name varchar(20),
age int default 10
);
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
insert into user10 (id, name) values(1,'zhangsan');
select * from user10;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | shangsan | 10 |
+------+----------+------+
insert into user10 values(2,'lisi',20);
select * from user1;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | shangsan | 10 |
| 2 | lisi | 20 |
+------+----------+------+
總結
如何新增約束
- 建表的時候就新增約束
- 可以使用alter、add
- alter...modif...
如何刪除約束
alter...drop...