使某个字段不重复且不得为空,确保表内所有数据的唯一性。
create table user(
id int primary key,
name varchar(20)
);
insert into user values(1,"zhangsan");
//mysql> insert into user values(1,"zhangsan");
//ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'
//主键是序号,再加一个1重复了,报错
//mysql> insert into user values(NULL,"zhangsan");
//ERROR 1048 (23000): Column 'id' cannot be null //主键为空了报错
into user values(2,"zhangsan");
select * from user;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
+----+----------+
多个主键 ,这里面每个主键都不能为空,并且加起来不重复即可。
create table user2(
id int,
name varchar(20),
password varchar(20),
primary key(id,name)
);
insert into user2 values(1,'zhangsan','123');
//insert into user2 values(1,'zhangsan','123');
//ERROR 1062 (23000): Duplicate entry '1-zhangsan' for key 'user2.PRIMARY'
//不能所有主键都重复
insert into user values(2,'zhangsan','123');
//Query OK, 1 row affected (0.00 sec) 有个别主键不重复的即可插入
主键由系统自动递增分配
create table user3(
id int primary key auto_increment,
name varchar(20)
);
//mysql> insert into user3 values('zhangsan');
//错误写法
insert into user3(name)values('zhangsan');
//正确写法,多了(自增主键)
insert into user3(name) values('zhangsan');
select * from user3;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
+----+----------+
如果忘记设置主键,还可以通过sql语句设置(两种方式)
alter table user add primary key(id);
alter table user modify id int primary key;
alter table user drop primary key;
该字段的值不可以重复。与主键约束的区别:
主键约束只能有一个,并且不重复不为空;
唯一约束的字段仅仅是数值上的不重复,可以为空,可以多个。
create table user5(
id int,
name varchar(20)
);
alter table user5 add unique(name);
desc user5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
insert into user5 values(1,'zhangsan');
//mysql> insert into user5 values(1,'zhangsan');
//ERROR 1062 (23000):
//Duplicate entry 'zhangsan' for key 'user5.name'
//张三重复,报错
insert into user5 values(1,'lisi');
insert into user5 values(1,NULL);
select * from user5;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 1 | lisi |
| 1 | NULL |
+------+----------+
//上述间接创建unique约束,下面直接unique约束
create table user5(
id int,
name varchar(20),
unique(name)
);
create table user5(
id int,
name varchar(20) unique
);
create table user8(id int , name varchar(20),unique (id,name));
insert into user8 values(1,'zhangsan');
//mysql> insert into user8 values(1,'zhangsan');
//多个字段都一样才算重复
insert into user8 values(2,'zhangsan');
//其中有字段不一样就没关系
insert into user8 values(1,'lisi');
select * from user8;
+------+----------+
| id | name |
+------+----------+
| 1 | lisi |
| 1 | zhangsan |
| 2 | zhangsan |
+------+----------+
alter table user add unique(name);
alter table user modify name varchar(20) unique;
alter table user drop index name;
约定某个字段的默认值
create table user10(
id int,
name varchar(20),
age int default 10
);
desc user10;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int | YES | | 10 | | //默认为10
+-------+-------------+------+-----+---------+-------+
insert into user10(id,name) values(1,'zhangsan');
select * from user10;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
+------+----------+------+
insert into user10 values(1,'zhangsan',19);
select * from user10;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 1 | zhangsan | 19 |
+------+----------+------+
//移除默认约束
alter table user modify age int;
涉及到父表,子表(主表副表),主表的数据被副表引用。
//classes主表
create table classes(
id int primary key,
name varchar(20)
);
//students副表
create table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
);
mysql> insert into classes values(1,"yiban");
mysql> insert into classes values(2,"erban");
mysql> insert into classes values(3,"sanban");
mysql> insert into classes values(4,"siban");
mysql> insert into students values(1001,'zhangsan',1);
mysql> insert into students values(1002,'zhangsan',2);
mysql> insert into students values(1003,'zhangsan',3);
mysql> insert into students values(1004,'zhangsan',4);
mysql> insert into students values(1005,'zhangsan',5);
//ERROR 1452 (23000): Cannot add or update a child row:
// a foreign key constraint fails
//(`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
//主表中不存在的记录5,不可以在附表中添加
mysql> delete from classes where id = 4; //注意删的是主表中的
//ERROR 1451 (23000): Cannot delete or update a parent row:
//a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
//当前主表中的记录正被别人引用着,不可删