MySQL&laravel 外键
一.数据约束(给表添加数据约束,从而约束用户操作表数据的行为)
1)默认值约束(default)
create table test(
name varchar(20),
gender varchar(20) default ‘男’
)
需求:当不插入gender的时候,分配一个‘男’的默认值
注意:1)当没有插入gender字段的时候,分配一个默认值
2)非空约束(not null)
create table test(
name varchar(20) not null,
gender varchar(20)
)
需求;name字段一定要有值(不能不插入数据,不能是null),这是给name添加非空约束
1)非空约束,不能不插入值
Insert into test(gender) values(‘男’);
2)非空约束,不能插入null
Insert into test(name,gender) values(null,’男’);
3)唯一约束(unique)
create table test(
Id int unique,
name varchar(20)
)
需求:id的值不能出现重复。这时就要给id添加一个唯一约束
1)不能插入重复的值
2)唯一约束,可以插入多个null。所以唯一约束不能约束null
Insert into test(id,name) values(1,’张三’);
4)主键约束(primary key)(唯一+非空)
注意;
1)通常情况下,我们会给每张表都设置一个主键字段,用来标记记录的唯一性
2)但是不建议把业务含义字段作为主键,因为随着业务的变化,业务字段可能出现重复
3)建议给每张表都独立添加一个叫id的字段,把这个id字段设置成主键,用来作为记录的唯一性
create table test(
Id int primary key,
name varchar(20)
)
1)唯一性
2)非空性
5)自增长约束(auto_increment)
create table test(
Id int primary key auto_increment,
name varchar(20)
)
自增长约束:初始值为0,每次递增1
使用truncate table 删除数据的时候,可以把自增长的初始值置为0
6)外键约束
员工表(副表:被别的表约束的表,外键设置在副表)
Create table employee(
Id int primary key auto_increment,
name varchar(20),
deptId int,
添加外键约束(foreign key)
Constraint employee_dept_fk foreign key(deptId) references dept(id)
外键名 外键字段
)
部门表(主表:约束别人的表)
Create table dept(
Id int primary key auto_increment,
Name varchar(20)
)
外键约束在什么情况下会起作用?
插入数据:当往副表插入了主表中不存在的数据时,外键起作用
修改数据:当往副表中修改主表中不存在的数据时,外键起作用
删除数据:副表中有关联主表数据的情况下,当删除主表数据时,外键起作用
当有了外键之后,应该如何管理数据呢?
插入数据:先插入主表的数据,再插入副表数据
修改数据:先修改主表数据,再修改副表数据
删除数据:先删除副表数据,再删除主表数据
7)级联技术(cascade)
级联:当有了外键的时候,我们希望修改或删除数据的时候,修改或删除主表数据时,同时能够影响副表的数据,这时就可以使用级联
Create table employee(
Id int primary key auto_increment,
name varchar(20),
deptId int,
添加外键约束(foreign key)
添加级联修改:on update cascade
添加级联修改:on delete cascade
Constraint employee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade
外键名 外键字段
);
部门表(主表:约束别人的表)
Create table dept(
Id int primary key auto_increment,
Name varchar(20)
);
*********************************************************** laravel 外键添加教程 *****************************************************************
外键约束
Laravel还提供了创建外键约束的支持,用于在数据库层面强制引用完整性。例如,我们在posts
表中定义了一个引用users
表的id
列的user_id
列:
Schema::table('posts', function ($table) { $table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users'); });
还有非常重要的:由于使用->increments()创建的column(通常是id)相对应的类型是unsigned integer(并且该column会自动作为primary key),所以在创建foreign key的时候,一定要记得把column添加->unsigned():
你还可以为约束的“on delete”和“on update”属性指定期望的动作:
$table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');
要删除一个外键,可以使用dropForeign
方法。外键约束和索引使用同样的命名规则——连接表名、外键名然后加上”_foreign”后缀:
$table->dropForeign('posts_user_id_foreign');
解释:
第一种情况:
这是数据库外键定义的一个可选项,用来设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则的。update 则是主键表中被参考字段的值更新,delete 是指在主键表中删除一条记录:
on update 和 on delete 后面可以跟的词语有四个
no action , set null , set default ,cascade
no action 表示 不做任何操作,
set null 表示在外键表中将相应字段设置为null
set default 表示设置为默认值
cascade 表示级联操作
就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除
第二种情况:
只加
$table->foreign('user_id') ->references('id')->on('users');
当你删除主表中的数据时,如果外键post表中有user_id的值,那么将提示你不可以删除user主表中的数据
转载链接:https://www.cnblogs.com/love-snow/articles/7416593.html