【问题标题】:About foreign key and index cluster in sql / knexjs关于sql/knexjs中的外键和索引簇
【发布时间】:2021-01-25 16:33:03
【问题描述】:

您好,我有一个关于外键的小问题:

我有我的表员工,我的 ID 为 uuid,我的 MATRICULA 编号(这是独一无二的,每个员工只有一个),在我的部门表中我想使用我的 manager_Id 外键并引用我的 MATRICULA 字段。

但是我不知道这在sql方面是否正确,即它引用了一个外键关系中不是primary的字段

我的表员工:

export async function up(knex: Knex): Promise<void> {
  return knex.schema.hasTable('employee').then(function (exists) {
    if (exists) return;
    return knex.schema // **** udpate
      .createTable('employees', table => {
        table.uuid('id').notNullable().primary();
        table.string('matricula', 100).notNullable().unique('matricula_idx');
        table.timestamp('created_at').defaultTo(knex.fn.now());
        table.timestamp('updated_at').defaultTo(knex.fn.now());
        table.timestamp('deleted_at');
      })
      .then(() => knex.raw(onUpdateTrigger('employees')));
  });
}

我的餐桌部门:

export async function up(knex: Knex): Promise<void> {
  return knex.schema.hasTable('employee').then(function (exists) {
    if (exists) return;
    return knex.schema // **** udpate
      .createTable('departaments', table => {
        table.uuid('id').notNullable().primary();
        table
          .string('departament_name', 100)
          .notNullable()
          .unique('departament_name');
        table.uuid('manager_id');
        table.timestamp('created_at').defaultTo(knex.fn.now());
        table.timestamp('updated_at').defaultTo(knex.fn.now());
        table.timestamp('deleted_at');
      })
      .then(() => knex.raw(onUpdateTrigger('departaments')));
  });
}

我还有一个关于 knexjs 迁移的更具体的问题:如何创建聚集索引?

【问题讨论】:

    标签: sql typescript knexjs


    【解决方案1】:

    根据我对 SQL 的了解,这只是答案的一半——我没有使用过 knexjs。

    • 这回答了第一个问题(引用 FK 中的非 PK 字段)。
    • 这并没有回答第二个问题 - 如何在 knexjs 中设置聚集索引。

    至少在理论上,外键不必引用主键 - 但它确实必须引用一列(或一组列)唯一的约束。只是大多数情况下,反正这就是PK。这是一个参考https://www.red-gate.com/simple-talk/sql/t-sql-programming/questions-about-primary-and-foreign-keys-you-were-too-shy-to-ask/#eighth

    由于您的矩阵列是独一无二的,因此可以用作 FK 的参考。理论上。这可能取决于正在使用的数据库,以及 knexjs 是否足够复杂以允许在设置期间使用它。

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 2011-04-09
      • 2011-05-25
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2012-02-13
      • 2010-11-01
      相关资源
      最近更新 更多