3. 5 关于复合唯一约束
create table 表名称( 字段名 数据类型, 字段名 数据类型, 字段名 数据类型, unique key(字段列表) #字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多个字段的组合是唯一的 );
#学生表 create table student( sid int, #学号 sname varchar( 20 ), #姓名 tel char( 11 ) unique key, #电话 cardid char( 18 ) unique key #身份证号 ); #课程表 create table course( cid int, #课程编号 cname varchar( 20 ) #课程名称 ); #选课表 create table student_course( id int, sid int, cid int, score int, unique key(sid,cid) #复合唯一 );
insert into student values( 1 ,'张三','13710011002','101223199012015623');#成功 insert into student values( 2 ,'李四','13710011003','101223199012015624');#成功 insert into course values( 1001 ,'Java'),( 1002 ,'MySQL');#成功
mysql> select * from student;
+-----+-------+-------------+--------------------+ | sid | sname | tel | cardid | +-----+-------+-------------+--------------------+ | 1 | 张三 | 13710011002 | 101223199012015623 | | 2 | 李四 | 13710011003 | 101223199012015624 | +-----+-------+-------------+--------------------+ 2 rows in set (0.00 sec) mysql> select * from course; +------+-------+ | cid | cname | +------+-------+ | 1001 | Java | | 1002 | MySQL | +------+-------+ 2 rows in set (0.00 sec)
insert into student_course values ( 1 , 1 , 1001 , 89 ), ( 2 , 1 , 1002 , 90 ), ( 3 , 2 , 1001 , 88 ), ( 4 , 2 , 1002 , 56 );#成功
mysql> select * from student_course; +----+------+------+-------+ | id | sid | cid | score | +----+------+------+-------+ | 1 | 1 | 1001 | 89 | | 2 | 1 | 1002 | 90 | | 3 | 2 | 1001 | 88 | | 4 | 2 | 1002 | 56 | +----+------+------+-------+ 4 rows in set (0.00 sec)
insert into student_course values ( 5 , 1 , 1001 , 88 );#失败 #ERROR 1062 (23000): Duplicate entry '1-1001' for key 'sid' 违反sid-cid的复合唯一
3. 5 删除唯一约束
- 添加唯一性约束的列上也会自动创建唯一索引。
- 删除唯一约束只能通过删除唯一索引的方式删除。
- 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
- 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名'; #查看都有哪些约束
ALTER TABLE USER DROP INDEX uk_name_pwd;
注意:可以通过 show index from 表名称; 查看表的索引
4. PRIMARY KEY 约束
4. 1 作用
用来唯一标识表中的一行记录。
4. 2 关键字
primary key
4. 3 特点
- 主键约束相当于 唯一约束+非空约束的组合 ,主键约束列不允许重复,也不允许出现空值。
- 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
- 主键约束对应着表中的一列或者多列(复合主键)
- 是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- MySQL的主键名总是PRIMARY ,就算自己命名了主键约束名也没用。
- 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的 主键索引 (能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
- 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
4. 4 添加主键约束
( 1 )建表时指定主键约束
create table 表名称( 字段名 数据类型 primary key, #列级模式 字段名 数据类型, 字段名 数据类型 ); create table 表名称( 字段名 数据类型, 字段名 数据类型, 字段名 数据类型, [constraint 约束名] primary key(字段名) #表级模式 );
举例:
create table temp( id int primary key, name varchar( 20 ) );
mysql> desc temp; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int( 11 ) | NO | PRI | NULL | | | name | varchar( 20 ) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
i
nsert into temp values( 1 ,'张三');#成功 insert into temp values( 2 ,'李四');#成功
mysql> select * from temp; +----+------+ | id | name | +----+------+ | 1 | 张三 | | 2 | 李四 | +----+------+ 2 rows in set (0.00 sec)
insert into temp values( 1 ,'张三');#失败 ERROR 1062 ( 23000 ): Duplicate(重复) entry(键入,输入) '1' for key 'PRIMARY' insert into temp values( 1 ,'王五');#失败 ERROR 1062 ( 23000 ): Duplicate entry '1' for key 'PRIMARY' insert into temp values( 3 ,'张三');#成功
mysql> select * from temp; +----+------+ | id | name | +----+------+ | 1 | 张三 | | 2 | 李四 | | 3 | 张三 | +----+------+ 3 rows in set (0.00 sec)
insert into temp values(4,null);#成功 insert into temp values(null,'李琦');#失败 ERROR 1048 (23000): Column 'id' cannot be null
mysql> select * from temp; +----+------+ | id | name | +----+------+ | 1 | 张三 | | 2 | 李四 | | 3 | 张三 | | 4 | NULL | +----+------+ 4 rows in set (0.00 sec)
#演示一个表建立两个主键约束 create table temp( id int primary key, name varchar(20) primary key ); ERROR 1068 (42000): Multiple(多重的) primary key defined(定义
再举例:
- 列级约束
CREATE TABLE emp4( id INT PRIMARY KEY AUTO_INCREMENT , NAME VARCHAR(20) );
- 表级约束
CREATE TABLE emp5( id INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(20), pwd VARCHAR(15), CONSTRAINT emp5_id_pk PRIMARY KEY(id) );
( 2 )建表后增加主键约束
ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表); #字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键
ALTER TABLE student ADD PRIMARY KEY (sid);
ALTER TABLE emp5 ADD PRIMARY KEY(NAME,pwd);
4. 5 关于复合主键
create table 表名称( 字段名 数据类型, 字段名 数据类型, 字段名 数据类型, primary key(字段名1,字段名2) #表示字段1和字段2的组合是唯一的,也可以有更多个字段 );
#学生表 create table student( sid int primary key, #学号 sname varchar(20) #学生姓名 ); #课程表 create table course( cid int primary key, #课程编号 cname varchar(20) #课程名称 ); #选课表 create table student_course( sid int, cid int, score int, primary key(sid,cid) #复合主键 );
insert into student values(1,'张三'),(2,'李四'); insert into course values(1001,'Java'),(1002,'MySQL');
mysql> select * from student; +-----+-------+ | sid | sname | +-----+-------+ | 1 | 张三 | | 2 | 李四 | +-----+-------+ 2 rows in set (0.00 sec) mysql> select * from course; +------+-------+ | cid | cname | +------+-------+ | 1001 | Java | | 1002 | MySQL | +------+-------+ 2 rows in set (0.00 sec)
insert into student_course values(1, 1001, 89),(1,1002,90),(2,1001,88),(2,1002,56);
mysql> select * from student_course; +-----+------+-------+ | sid | cid | score | +-----+------+-------+ | 1 | 1001 | 89 | | 1 | 1002 | 90 | | 2 | 1001 | 88 | | 2 | 1002 | 56 | +-----+------+-------+ 4 rows in set (0.00 sec)
insert into student_course values(1, 1001, 100); ERROR 1062 (23000): Duplicate entry '1-1001' for key 'PRIMARY'
mysql> desc student_course; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | sid | int(11) | NO | PRI | NULL | | | cid | int(11) | NO | PRI | NULL | | | score | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
- 再举例
CREATE TABLE emp6( id INT NOT NULL, NAME VARCHAR(20), pwd VARCHAR(15), CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd) );
4. 6 删除主键约束
alter table 表名称 drop primary key;
举例:
ALTER TABLE student DROP PRIMARY KEY;
ALTER TABLE emp5 DROP PRIMARY KEY;
说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。