mysql建表约束:主键约束、自增约束、外键约束、唯一约束、非空约束、默认约束
1. 主键约束:
它能够唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空
create tables user (
id int primary key,
name varchar(20)
);
desc user;
输出:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
发现 id是不可以为null 而且 key的值 也变为:PRI(primary)
2. 复合主键:
create table user2(
id int,
name varchar(20)
primary key(id,name)
);
desc user2;
输出:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
INSERT INTO user2 VALUES (1,'张三');
INSERT INTO user2 VALUES (2,'老王');
说明了复合主键只要所有的字段都不是相同的情况下可以允许其中的字段重复,即:主键值加起来不重复就可以,且主键中任何字段都不为空
3. 自增约束
create table user3(
id int primary key auto_increment,
name varchar(20)
);
desc user3;
输出:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | ~~auto_increment~~ |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
INSERT INTO user3(name) VALUES('张三');
INSERT INTO user3(name) VALUES('李四');
select * from user3;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
+----+--------+
没有自定义id值 但是自动生成了id
4. 唯一约束:
**方法一:**
create table user4(
id int primary key,
name varchar(20)
);
desc user4; 查看表结构
使用modify 修改字段id
alter table user5 modify id int unique;
desc user4; 查看表结构
drop table user5; 删除表
方法二:
create table user5(
id int,
name varchar(20)
);
alter table user5 add unique(id);
desc user5; 查看表结构
drop table user5;
方法三:
create table user5(
id int unique,
name varchar(20)
);
desc user5; 查看表结构
小结: 主键约束(primary key)中包含了唯一约束
5. 非空约束
*添加not null*
CREATE TABLE user_test1(
id int,
name varchar(20) not null
);
desc user_test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
正确的插入的语句可以是:
insert into user_test(name) valuse('李四');
insert into user_test valuse(1,'李四');
6. 默认约束
默认约束:就是当我们插入字段值的时候,如果没有传值,就会使用默认值
create table user10(
id int ,
name varchar(20),
age int default 10
);
desc user10;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
插入数据:
insert into user10(id,name) values(20,'张三');
insert into user10(id,name) values(22,'李四');
insert into user10 valuse(12,'吴成伟',18);
查看表中数据信息:
select * from user10;
+------+-----------+------+
| id | name | age |
+------+-----------+------+
| 20 | 张三 | 10 |
| 22 | 李四 | 10 |
| 12 | 吴成伟 | 18 |
+------+-----------+------+
3 rows in set (0.00 sec)
**没有设置age的值,但是给我们创建了默认值 10**
7. 外键约束:
外键约束:设计到两个表:主表、副表(父表、子表)
--班级表
create table classes(
id int primary key,
name varchar(20)
);
--学生表
create table students(
id int primary key,
name varchar(20),
foreign key(class_id) references classes(id)
);
向班级表中插入数据:
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,'张三',1);
insert into students values(1002,'张三',2);
insert into students values(1003,'张三',3);
insert into students values(1004,'张三',4);
向学生表中插入数据:(错误插入)
insert into studens values(1005,'张三',5);
**会报错,因为子表添加了,主表中没有的数据**
外键约束的特点:
- 主表中没有的数据,在副表中插入,是不可以使用的
- 主表中的记录被副表引用,是不可以被删除的。