关于 sql/knexjs 中的外键和索引集群

About foreign key and index cluster in sql / knexjs

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

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

但我不知道这是否符合sql,也就是说,它引用了一个在外键关系中不是主要的字段

我的table员工:

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')));
  });
}

我的table部门:

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 - 我没有使用过 knexjs。

  • 这回答了第一个问题(引用 FK 中的 non-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

因为你的matricula专栏是独一无二的,作为FK的参考应该没问题。理论上。这可能取决于正在使用的数据库,以及 knexjs 是否足够复杂以在设置期间允许它。