【MySQL】2、MySQL建表中的约束

【MySQL】2、mysql建表中的约束

  • 一、主键约束
    • 1、主键约束
    • 2、联合主键
    • 3、自增约束
    • 4、增后期添加&删除主键约束
  • 二、唯一约束
    • 1、唯一约束
    • 2、多个唯一约束
    • 3、添加 和 删除唯一主键
  • 三、默认约束
  • 四、外键约束


一、主键约束

1、主键约束

使某个字段不重复且不得为空,确保表内所有数据的唯一性。

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

2、联合主键

多个主键 ,这里面每个主键都不能为空,并且加起来不重复即可。

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) 有个别主键不重复的即可插入

3、自增约束

主键由系统自动递增分配

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

4、增后期添加&删除主键约束

如果忘记设置主键,还可以通过sql语句设置(两种方式)

alter table user add primary key(id);
alter table user modify id int primary key;
alter table user drop primary key;

二、唯一约束

1、唯一约束

该字段的值不可以重复。与主键约束的区别:
主键约束只能有一个,并且不重复不为空;
唯一约束的字段仅仅是数值上的不重复,可以为空,可以多个。

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

2、多个唯一约束

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

3、添加 和 删除唯一主键

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`))
//当前主表中的记录正被别人引用着,不可删

你可能感兴趣的:(MySQL,mysql,数学建模,数据库)