关于 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 是否足够复杂以在设置期间允许它。
你好,我有一个关于外键的小问题:
我有我的 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 是否足够复杂以在设置期间允许它。