1. 程式人生 > 實用技巧 >Mysql學習筆記#6-約束

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))

結論

  1. 主表 classes 中沒有的資料值,在副表中,不可以被引用。
  2. 主表中的記錄被副表引用時,是不可以被刪除的。
    delete from classes where id=4;
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (study.students, CONSTRAINT students_ibfk_1 FOREIGN KEY (class_id) REFERENCES classes (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...