标签: foreign-keys

Bool 字段作为唯一索引

Bool 字段可以成为唯一索引并与另一个表的索引一起用于外键关系吗?

我不认为它可以成为主键,但唯一索引呢?每次我尝试将其转换为唯一索引时,它都会将其转换为 tinyint。

编辑

所以我有一个SQL关系问题。假设我有一个数据库,我想在其中保存有关个人的信息记录。现在我已经设置了一个表格来处理这些信息。好的到目前为止一切顺利。

通常可以在表中发现重复信息并将其删除。如果特定字段与另一行中的另一个字段具有相同的值,则记录被视为重复。示例:重复的电子邮件。

现在我想在数据库中创建另一个表来跟踪发现和删除的每个重复项。我对此的第一个想法是创建外键关系。所以我创建了一个dupes表,然后将其连接到我的persons表。这种关系是一个简单的外键到主键的关系,带有删除约束。

现在虽然这可能一开始有用,但问题出现了,dupes 表正在接收被删除的记录,即使它们没有被删除,因为它们是被欺骗的。这是一个问题,因为即使我决定从persons表中删除一个人只是因为我不喜欢他们,他们还是会存储在dupes表中。

然后我想,为什么不在 people 表中创建一个处置字段并将其作为唯一键或主键连接到我的 dupes 表的索引外键。那么问题是一个唯一的键必须有一个唯一的值,所以欺骗的多重处置或者我不喜欢你不会工作。另一种选择是使处置字段成为主键。不过也有同样的问题。

这个问题的正确关系是什么?

mysql sql database-design foreign-keys

1
推荐指数
1
解决办法
1048
查看次数

Postgres 跨表的唯一组合约束

我有三张桌子 -

file (
  file_id int primary key
  filename text not null
  etc...
)
product (
  product_id int primary key
  etc....
)
product_attachment (
  product_id references product
  file_id references file
)
Run Code Online (Sandbox Code Playgroud)

我想确保当这些是自然连接时,product_id + 文件名是唯一的。到目前为止,我拥有的最佳解决方案是将文件名添加到 product_attachment 表中,但我想知道是否有办法避免这种情况。

sql postgresql foreign-keys unique-constraint

1
推荐指数
1
解决办法
4407
查看次数

删除限制错误时的外键 - Oracle

最近,我一直在尝试在表中添加以下外键,在 Oracle 中使用 RESTRICT 子句使用以下命令。:

ALTER TABLE 
Employee_SalHead 
ADD CONSTRAINT PAYROLL_SHEAD_FKEY FOREIGN KEY
(
  SalHead_ID 
)
REFERENCES SalHead
(
  SalHead_ID
)
ON DELETE RESTRICT ENABLE;
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

错误从命令中的第 11 行开始 - ALTER TABLE Employee_SalHead ADD CONSTRAINT PAYROLL_SHEAD_FKEY FOREIGN KEY (SalHead_ID) REFERENCES SalHead (SalHead_ID) ON DELETE RESTRICT ENABLE 错误报告 - SQL 错误:ORA-009009005 关键字“丢失”关键字 *000000000005原因:
*动作:

此外,如果我通过 Oracle SQL 开发人员尝试相同的操作,我只会得到选项 Set Null、Cascade 和 No Action Only。

oracle foreign-keys

1
推荐指数
1
解决办法
1万
查看次数

Django - 基于外键字段获取对象

我需要基于一组字段获取单个模型对象,其中一个是ForeignKey. 所以如果我有以下模型:

class Composer(models.Model):
    name = models.CharField()
    dates =  models.CharField()
    nationality = models.CharField()
    period = models.CharField()

class Symphony(models.Model):
    composer = models.ForeignKey('Composer', related_name="symphonies", null=True)
    date = models.CharField()
    key = models.CharField()
    number = models.IntegerField()
    num_movements = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

然后如何Symphony根据其composernumber字段检索特定对象?我最初将 composer 作为一个 simple models.CharField(),所以我可以这样做:

Symphony.objects.get(composer='Bruckner', number=7)
Run Code Online (Sandbox Code Playgroud)

那么我如何使用 a 做等效的事情ForeignKey

django foreign-keys

1
推荐指数
1
解决办法
1892
查看次数

从表中删除行(另一个表)

我有两个表 A 和 B,在 B 中有一个来自 A 的外键,我想要做的是从 A 中删除它们在 B 中没有出现的所有行,我执行以下查询,但它是不工作:

DELETE from A 
WHERE  id_A
       not in (select DISTINCT(foreign_key_of_A_in_B) from B)
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?

mysql sql foreign-keys sql-delete

1
推荐指数
1
解决办法
6836
查看次数

在 Laravel 中添加字符串类型的外键时出错

我有两张桌子,一张代金券和一张订单。凭证需要有16个字符串作为ID,随机创建。当 ID 作为整数递增时一切正常,但是当更改为字符串时,我无法让它添加外键,出现此错误:

 [Illuminate\Database\QueryException]
 SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
 : alter table `orders` add constraint `orders_voucher_id_foreign` foreign k
 ey (`voucher_id`) references `vouchers` (`id`))

 [PDOException]
 SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
Run Code Online (Sandbox Code Playgroud)

这是我的表:

    Schema::create('vouchers', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->string('id');
        $table->integer('value');
        $table->string('status');
        $table->timestamps();
    });

    Schema::create('orders', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->integer('event_id')->unsigned();
        $table->string('voucher_id');
        $table->timestamps();      

        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('event_id')->references('id')->on('events');
        $table->foreign('voucher_id')->references('id')->on('vouchers');
    });
Run Code Online (Sandbox Code Playgroud)

任何反馈将不胜感激。提前致谢。

php mysql foreign-keys laravel eloquent

1
推荐指数
1
解决办法
1427
查看次数

mySQL 如何更改列以具有外键?

我想将其中一个表中的一列更改为引用另一个表中的另一列。我尝试通过以下方式引入外键:

ALTER TABLE `table` ALTER COLUMN `id_l` int NOT NULL,外键 (`id_l`) 引用 table_b(`id_l`);

ALTER TABLE `table` CHANGE `id_l` `id_l` int NOT NULL,外键 (`id_l`) 引用 table_b(`id_l`);

我被抛出一个语法错误。

一种解决方法是删除该表并创建一个具有所需引用的新表(这有效),但我想按原样更改该表,而不是传输数据。我该怎么做呢?

MySQL 服务器 5.6.17

mysql foreign-keys

1
推荐指数
1
解决办法
9527
查看次数

一对多关系总是被 PowerBI 变成多对一

我在 PowerBI 中有两个来自 Azure SQL 的表,使用直接查询:

  • EMP(empID PK)
  • contactInfo(contactID PK, empID FK, contactDetail)

EMP.empID到有明显的一对多关系contactInfo.empID。外键约束已成功实施。

但是,我只能在 PowerBI 中创建多对一关系 ( contactInfo.empIDto EMP.empID)。如果我尝试相反的方法,PowerBI 总是会自动将关系转换为多对一(通过交换 from 和 to 列),这会阻止我创建视觉效果。PowerBI 是否认为两者是等价的?

更新:

我所做的只是在 PowerBI 中创建一个表,显示这两个表的连接结果。外键约束是contactInfo.empID REFERENCES EMP.empID,它是多对一的。我想这应该不是问题,因为我可以使用 SQL 直接查询连接。

还请建议我是否应该在相反的方向创建外键。

有关创建视觉失败的更多信息

确切的错误消息是:

Can't display the data because Power BI can't determine 
the relationship between two or more fields.
Version: 2.43.4647.541 (PBIDesktop)
Run Code Online (Sandbox Code Playgroud)

要重现错误:

数据库架构如下:

模式

我想要的是 PowerBI 中的一个表,显示员工的联系方式和销售信息,即加入所有四个表。当表视觉对象的 VALUES 包含“empName、contactDetail、contactType、productName”时会发生错误,但是,如果我只包含“empName、contactDetail、contactType”或“empName、productName”,则不会发生错误。起初我以为问题可能出在contactInfo和emp之间的关系上,但现在似乎更复杂了。我猜这可能是由多个一对多关系引起的?

data-visualization foreign-keys relationship powerbi

1
推荐指数
1
解决办法
3102
查看次数

属于外键

我深深地陷入了一个在我看来应该很简单的belongs_to 关系上。

如果我在从票证到帐户的迁移中创建数据库关联,则会在票证表上创建一个名为“account_id”的数据库字段,这很好。然后在我的 Ticket 模型中,我输入了:

belongs_to :created_by, class_name: 'Account'
Run Code Online (Sandbox Code Playgroud)

但是从 rails 5 开始,belongs_to 关系会自动添加对 account_id 要求是否存在的验证。但是,如果我传入 created_by,则验证失败。因为我想验证 created_by 而不是 account_id 的存在。所以我添加了可选的:true 标签

belongs_to :created_by, class_name: 'Account', optional: true
Run Code Online (Sandbox Code Playgroud)

然后分别验证 created by 的存在

validates_presence_of :created_by
Run Code Online (Sandbox Code Playgroud)

这一切都有效,但我不喜欢我自相矛盾地说可选,然后在一行之后验证它是真正相同的领域!

然后我开始思考如果tickets 表上的数据库中的字段实际上被称为created_by 并且使用一些主键和外键的东西我建立的关系它应该修复它吗?

但是我不确定如何构建迁移,然后不确定如何编写belongs_to。我试过:

add_column :tickets, :created_by, :bigint
add_index :tickets, :created_by
Run Code Online (Sandbox Code Playgroud)

belongs_to :created_by, class_name: 'Account', foreign_key: :created_by, primary_key: :account_id
Run Code Online (Sandbox Code Playgroud)

但这完全失败了,但是如果我这样做

belongs_to :account, foreign_key: :created_by
Run Code Online (Sandbox Code Playgroud)

这使我能够使用 account_id 为 1 来更新 created_by,但是如果我运行,ticket.created_by我会得到 int 并ticket.account返回该帐户。我希望这是相反的。

activerecord ruby-on-rails foreign-keys ruby-on-rails-5

1
推荐指数
1
解决办法
6110
查看次数

具有外键字段的模型的 Django ModelForm 无法正确显示 selectBox

这可能很容易解决。我创建了一个使用 forms.ModelForm 的表单。我的模型有 ForeignKey 字段。表单为外键创建了一个选择字段,但没有正确显示值。

模型.py

from django.db import models

# Create your models here.

class Gender(models.Model):

  name = models.CharField(max_length=8, null=True)

  class Meta:
    db_table='gender'

class UserExample(models.Model):

  name     = models.CharField(max_length=16,null=True)
  age      = models.IntegerField(blank=True, null=True)
  gender   = models.ForeignKey('Gender', on_delete=models.SET_NULL, null=True)

  class Meta:
      db_table='userExample'

  def __str__(self):
      return ""
Run Code Online (Sandbox Code Playgroud)

表格.py

from django import forms

from .models import UserExample, Gender

class UserForm(forms.ModelForm):

    class Meta:
        model = UserExample
        fields = ('name', 'age', 'gender')
Run Code Online (Sandbox Code Playgroud)

视图.py

from django.shortcuts import render    
from .forms import UserForm

# Create your views …
Run Code Online (Sandbox Code Playgroud)

python forms django foreign-keys

1
推荐指数
1
解决办法
6205
查看次数