例:创建一个t_user表,其中username不允许为空。
create table t_user(
id int,
username varchar(255) not null,
password varchar(255)
);
此时执行数据插入时若password对应项为空则报错:
insert into t_user(id,password) values(1,'123');
ERROR 1364 (HY000): Field 'username' doesn't have a default valueERROR 1364 (HY000): Field 'username' doesn't have a default value
唯一约束修饰的字段具有唯一性,不能重复。但可以为NULL。
create table t_user(id int,username varchar(255) unique);
其中username被添加了唯一约束,此时若重复插入username一样的数据会报错:
insert into t_user(id,username) values(1,'zhangsan');
insert into t_user(id,username) values(2,'zhangsan');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 't_user.username'
create table t_user(
id int,
usercode varchar(255),
username varchar(255),
unique(usercode,username)
);
此时多个字段联合起来添加1个约束unique。
我们可以向表内添加任何(username,usercode)不重复的数据。如:
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
insert into t_user values(3,'222','zs');
结果是添加成功:
+------+----------+----------+
| id | username | usercode |
+------+----------+----------+
| 1 | 111 | zs |
| 2 | 111 | ls |
| 3 | 222 | zs |
+------+----------+----------+
但是当我们添加(username,usercode)相同的数据时就会报错:
insert into t_user values(4,'111','zs');
ERROR 1062 (23000): Duplicate entry '111-zs' for key 'usercode'
如果想要username和usercode分别是唯一的,则需分别添加唯一性约束。
create table t_user(
id int,
usercode varchar(255) unique,
username varchar(255) unique
);
表级唯一性约束也可以只对单一字段进行约束,效果和列级约束一样
主键分为单一主键和复合(联合)主键,单一主键是由一个字段构成的,复合(联合)主键是由多个字段构成的。
主键有什么作用?
主键的特点:不能为NULL,也不能重复。
一张表的主键约束只能有1个。
主键相关的术语?
主键约束 : primary key
主键字段 : id字段添加primary key之后,id叫做主键字段
主键值 : id字段中的每一个值都是主键值。
主键的分类?
根据主键字段的字段数量来划分:
根据主键性质来划分:
create table t_user(
id int primary key, // 列级约束
username varchar(255),
email varchar(255)
);
insert into t_user(id,username,email) values(1,'zs','[email protected]');
insert into t_user(id,username,email) values(2,'ls','[email protected]');
insert into t_user(id,username,email) values(3,'ww','[email protected]');
select * from t_user;
+----+----------+------------+
| id | username | email |
+----+----------+------------+
| 1 | zs | [email protected] |
| 2 | ls | [email protected] |
| 3 | ww | [email protected] |
+----+----------+------------+
在添加了主键的表中不能添加重复的数据:
insert into t_user(id,username,email) values(1,'jack','[email protected]');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
也不能不添加数据,即不能为空
insert into t_user(username,email) values('jack','[email protected]');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
create table t_user(
id int,
username varchar(255),
password varchar(255),
primary key(id,username)
);
create table t_user(
id int,
username varchar(255),
primary key(id)
);
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
id字段自动维护一个自增的数字,从1开始,以1递增。
insert into t_user(username) values('a');
insert into t_user(username) values('b');
insert into t_user(username) values('c');
insert into t_user(username) values('d');
insert into t_user(username) values('e');
insert into t_user(username) values('f');
select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
| 6 | f |
+----+----------+
foreign key(子表字段名) references 父表名(父表被引用字段名)
请设计数据库表,用来维护学生和班级的信息?
no(pk) name classno classname
-------------------------------------------------------
1 zs1 101 高三1班
2 zs2 101 高三1班
3 zs3 102 高三2班
4 zs4 102 高三2班
5 zs5 102 高三2班
t_class 班级表
cno(pk) cname
-----------------------
101 高三1班
102 高三2班
t_student 学生表
sno(pk) sname classno(该字段添加外键约束fk)
--------------------------------------------------
1 zs1 101
2 zs2 101
3 zs3 102
4 zs4 102
5 zs5 102
t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
foreign key(classno) references t_class(cno)
);