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

 

posted @ 2018-08-16 16:18  独孤剑—宇枫  阅读(261)  评论(0编辑  收藏  举报