如何使外键不使用主键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使外键不使用主键相关的知识,希望对你有一定的参考价值。

我在Laravel上迁移了一个像这样的表pasien:

public function up()
{
    Schema::create('pasien', function (Blueprint $table) {
        $table->string('No_RM');
        $table->timestamps();


        $table->primary('No_RM');
    });
}

现在我想为No_RM创建一个外键,而不是id

public function up()
{
    Schema::create('data_primary', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unique('RM_id');
        $table->string('file_primary');
        $table->timestamps();

        $table->foreign('RM_id')->references('No_RM')->on('pasien');
    });
}

仍然有错误

1064您的SQL语法有错误;查看与您的mysql服务器版本对应的手册,以便在'unsigned not null,file_primary varchar(255)not null,created_at timestamp'在第1行附近使用正确的语法

有人可以纠正我的错误吗?

答案

只需添加另一个迁移来修改你的pasien

Schema::table('pasien', function (Blueprint $table) {
   $table->unique('RM_id');
});

现在你可以在RM_id,table中声明data_primary作为外键,成为外键,它应该是唯一键。

如果您放弃了迁移,则可以创建新的表格

病人的桌子

public function up()
{
    Schema::create('pasien', function (Blueprint $table) {
        $table->increments('id');
        $table->string('No_RM')->unique();
        $table->timestamps();
    });
}

和data_primary表

public function up()
{
    Schema::create('data_primary', function (Blueprint $table) {
        $table->increments('id');
        $table->string('RM_id');
        $table->string('file_primary');
        $table->timestamps();

        $table->foreign('RM_id')->references('RM_id')->on('pasien')
                ->onUpdate('cascade')->onDelete('cascade');
    });
}
另一答案

从概念上讲,你不能将外键引用到非主键,它打破了关系数据库的概念,你能为我提供ERD,也许我可以帮助重新设计你的数据库结构

以上是关于如何使外键不使用主键的主要内容,如果未能解决你的问题,请参考以下文章

如何使外键成为必需?

Navicat for MySQL 中我设置了外键之后,外键却可以和主键不一样,两张图里面的产品型号和库房是又关联的

SSMS设置主键/主键组/外键

主键和外键的作用

总结14

识别和非识别关系之间有什么区别?