0

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

我有我的表员工,我的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 迁移的更具体的问题:如何创建聚集索引?

4

1 回答 1

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 /#第八

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

于 2020-10-11T02:33:19.360 回答