mysql加入表约束(not null,unique,primary key,foreign key)

    科技2024-01-27  115

    文章目录

    创建表加入约束非空约束(not null)唯一约束(unique)主键约束(primary key)外键约束,foreign key

    创建表加入约束

    常见的约束 a) 非空约束,not null b) 唯一约束,unique c) 主键约束,primary key d) 外键约束,foreign key e) 自定义检查约束,check(不建议使用)(在mysql中现在还不支持)

    非空约束(not null)

    非空约束,针对某个字段设置其值不为空,如:学生的姓名不能为空

    drop table if exists t_student; create table t_student( student_id int(10), student_name varchar(20) not null, sex char(2) default 'm', birthday date, email varchar(30), classes_id int(3) )

    执行语句:insert into t_student(student_id, birthday, email, classes_id) values(1002, '1988-01-01', 'qqq@163.com', 10)

    以上错误为加入的学生姓名为空。

    唯一约束(unique)

    唯一性约束,它可以使某个字段的值不能重复,如:email不能重复:

    drop table if exists t_student; create table t_student( student_id int(10), student_name varchar(20) not null, sex char(2) default 'm', birthday date, email varchar(30) unique, classes_id int(3) )

    执行语句:insert into t_student(student_id, student_name , sex, birthday, email, classes_id) values(1001,'zhangsan','m', '1988-01-01', 'qqq@163.com', 10)

    如果插入了重复的email,会出现了“违反唯一约束错误”,所以unique起作用了 同样可以为唯一约束起个约束名

    我们可以查看一下约束 mysql> use information_schema; mysql> select * from table_constraints where table_name = 't_student';

    关于约束名称可以到table_constraints中查询 以上约束的名称我们也可以自定义。

    drop table if exists t_student; create table t_student( student_id int(10), student_name varchar(20) not null, sex char(2) default 'm', birthday date, email varchar(30) , classes_id int(3) , constraint email_unique unique(email)/*表级约束*/ )

    主键约束(primary key)

    每个表应该具有主键,主键可以标识记录的唯一性,主键分为单一主键和复合(联合)主键,单一主键是由一个字段构成的,复合(联合)主键是由多个字段构成的。

    drop table if exists t_student; create table t_student() student_id int(10) primary key,/*列级约束*/ student_name varchar(20) not null, sex char(2) default 'm', birthday date, email varchar(30) , classes_id int(3) )

    insert into t_student(student_id, student_name , sex, birthday, email, classes_id) values (1001,'zhangsan','m', '1988-01-01', 'qqq@163.com', 10) 向以上表中加入学号为1001的两条记录,出现如下错误,因为加入了主键约束 我们也可以通过表级约束为约束起个名称:

    drop table if exists t_student; create table t_student( student_id int(10), student_name varchar(20) not null, sex char(2) default 'm', birthday date, email varchar(30) , classes_id int(3), CONSTRAINT p_id PRIMARY key (student_id) ) insert into t_student(student_id, student_name , sex, birthday, email, classes_id) values(1001,'zhangsan','m', '1988-01-01', 'qqq@163.com', 10);

    外键约束,foreign key

    在字段之后增加外键:[constraint 外键名] foreign key(外键字段) reference 主表(主键);

    删除/修改外键:先删除后增加 基本语法:alter table 从表 drop foreign key 外键(不能删除索引) 删除索引:alter table 表名 drop index 索引名

    外键主要是维护表之间的关系的,主要是为了保证参照完整性,如果表中的某个字段为外键字段,那么该字段的值必须来源于参照的表的主键。

    首先建立班级表t_classes drop table if exists t_classes; create table t_classes( classes_id int(3), classes_name varchar(40), constraint pk_classes_id primary key(classes_id) ) 在t_student中加入外键约束 drop table if exists t_student; create table t_student( student_id int(10), student_name varchar(20), sex char(2), birthday date, email varchar(30), classes_id int(3), constraint student_id_pk primary key(student_id), constraint fk_classes_id foreign key(classes_id) references t_classes(classes_id) ) 向t_student中加入数据 insert into t_student(student_id, student_name, sex, birthday, email, classes_id) values(1001, 'zhangsan', 'm', '1988-01-01', 'qqq@163.com', 10)

    出现错误,因为在班级表中不存在班级编号为10班级,外键约束起到了作用

    存在外键的表就是子表,参照的表就是父表,所以存在一个父子关系,也就是主从关系。主表就是班级表,从表就是学生表

    以上成功的插入了学生信息,当时classes_id没有值,这样会影响参照完整性,所以我们建议将外键字段设置为非空

    drop table if exists t_student; create table t_student( student_id int(10), student_name varchar(20), sex char(2), birthday date, email varchar(30), classes_id int (3) not null, constraint student_id_pk primary key(student_id), constraint fk_classes_id foreign key(classes_id) references t_classes(classes_id) ) insert into t_student(student_id, student_name, sex, birthday, email, cla sses_id) values(1001, 'zhangsan', 'm', '1988-01-01', 'qqq@163.com', null);

    再次插入班级编号为null的数据

    添加数据到班级表,添加数据到学生表,删除班级数据,将会出现如下错误:

    insert into t_classes (classes_id,classes_name) values (10,'366'); insert into t_student(student_id, student_name, sex, birthday, email, classes_id) values(1001, 'zhangsan', 'm', '1988-01-01', 'qqq@163.com', 10);

    mysql> update t_classes set classes_id = 20 where classes_name = '366';

    因为子表(t_student)存在一个外键classes_id,它参照了父表(t_classes)中的主键,所以先删除子表中的引用记录,再修改父表中的数据。 我们也可以采取以下措施 级联更新。

    mysql> delete from t_classes where classes_id = 10;

    因为子表(t_student)存在一个外键classes_id,它参照了父表(t_classes)中的主键,所以先删除父表,那么将会影响子表的参照完整性,所以正确的做法是,先删除子表中的数据,再删除父表中的数据,采用drop table也不行,必须先drop子表,再drop父表。

    Processed: 0.018, SQL: 9