当前位置: 首页 > 知识库问答 >
问题:

外键不强制laravel/PHPMYADMIN中的参照完整性

田晨
2023-03-14

我有用户电话表,我在laravel中建立了一对一的关系,这很好,但如果我尝试在不引用任何用户(id)的情况下手动将数据(外键用户id)添加到电话表中,它也会起作用。

mysql(phpmyadmin)中,迁移后没有建立外键关系。

所以我想问,外键的优势是什么,如果它不把任何约束放在数据库表中,或者如果有任何方法可以使用laravel添加这些约束,请告诉我。

代码片段

app/Phone.php

public function user(){
    return $this->belongsTo('App\User');
}

app/User.php

public function phone(){
    return $this->hasOne('App\Phone');
}

routes/web.php

Route::get('/', function () {

    $user = factory(\App\User::class)->create();
    $phone=new \App\Phone;

    $phone->phone = '123456789';
    $phone->user_id = '1';
    $user->phone()->save($phone);


});

电话(迁移)

public function up()
{
    Schema::create('phones', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('phone');
        $table->unsignedBigInteger('user_id')->index();
        $table->timestamps();

        $table->foreign('user_id')->references('id')->on('users');
    });
}

Users表中没有任何id为10的用户,但这也可以工作并将数据添加到手机(user\u id)

$phone->phone = '123456789';
$phone->user_id = '10';
$phone->save();

共有1个答案

哈和惬
2023-03-14

没有外键,使用关系数据库就没有意义。它帮助您保持完整性和一致性。在插入子表时,它将始终检查父表中的记录,另一方面,由于索引的原因,它减少了执行时间。

在您的情况下,您可以将数据插入子表中,因为您没有进行引用键约束。如果不使用它,那么就破坏了关系数据库引擎的角色。

它不是任何框架或编程语言的一部分,而是关于正确的数据库配置和设计。拉威尔对此不负责。

这也有一个缺点,但它只是在机器上。它增加了服务器CPU的成本。

 类似资料:
  • 问题内容: 我正在使用phpMyAdmin建立数据库。我有两个表(和), 在它们的主键上建立了索引 。我正在尝试使用它们的主键作为外键在它们之间创建一个关系表()。 我将这些表创建为MyISAM,但是后来将这三个表都更改为InnoDB,因为我读到MyISAM不支持外键。所有字段均为。 当我选择表格时,单击“关系视图”链接,然后尝试将FK列设置为和,它显示 “未定义索引!” 每列旁边。 我想念什么?

  • 问题内容: 我正在尝试解析Web请求并将其保存到数据库。我有3个模型,第一个节点是virtualDocument。这是uniq表(根据请求url)。VirtualRequest表具有所有erquest主体,而HttpHeaderList表根据其virtualRequest bean ID具有所有thhp标头。 当我尝试保存第一个日志时,出现了这样的错误; 这是VirtualDocument bea

  • 问题内容: 我们计划使用触发器和需要审计的每个表的单独历史表在数据库中引入简单的审计跟踪。 例如考虑表StudentScore,它只有很少的外键(例如StudentID,CourseID)将其链接到相应的父表(Student&Course)。 如果StudentScore需要审核,我们计划创建审核表StudentScoreHistory- 如果修改了StudentScore中的任何行,我们会将旧行

  • 我一直在试图找到通过外键从记录中获取所有数据的正确方法。我有一个简单的应用程序,用户可以将书籍添加到他们的“书架”。 这是我的桌子: 使用者 书 书架 BOOKSHELF_BOOKS 在我雄辩的模型中,一个有许多书,而属于,我已经在我的模型中设置了这些书。 用户创建一个“书架”并从图书列表中向其中添加图书。 我现在需要在书架上渲染用户的书籍。 当我使用类似bookshelf::find($id)的

  • 问题内容: 我有以下问题。我的Linux机器上有一棵单独的{bin,lib,include}树,安装了我的开发工作所需的CMake和所有库。但是只有PATH环境变量被设置到该bin目录,由于某些原因,我无法设置LD_LIBRARY_PATH。该树中的所有程序都是使用RPATH构建的。我正在使用的CMake3.3.1也在此树中。 现在,我想使用libcurl编译程序并设置以下CMakeLists.t

  • 本文向大家介绍如何在Oracle中使用主键约束和外键约束来增强数据库完整性?,包括了如何在Oracle中使用主键约束和外键约束来增强数据库完整性?的使用技巧和注意事项,需要的朋友参考一下 问题: 您要使用主键约束和外键约束来强制Oracle中的数据库完整性。 解 在以完整性定义的表上执行的任何DML语句(INSERT,UPDATE或DELETE)都有助于确保表中的行保持其完整性。 让我们看一些显示