SQL - 元组作为主键
SQL - Tuple as Primary Key
如何从 table 的元组创建主键?
例子-
table a: [id|name]
table b: [id|name]
table axb:[a_id|b_id]
现在我们想给 axb 添加一个主键,这样元组 {alpha, beta} 是唯一的。换句话说,table 不能包含行 (alpha, beta) 和 (beta, alpha)。这将扩展到元组,但我要问的是夫妻开始保持这种简单。
我正在使用 MySql 14.14/5.5.50 - 但我希望这没关系。
请注意,复合键不能解决此问题,因为 a_id/b_id 上的复合键仍会允许具有逆元组顺序的行作为新行
不幸的是,您需要使用触发器在 MySQL 中执行此操作。许多数据库都支持这样的语法:
create unique index unq_t_alpha_beta on (least(alpha, beta), greatest(alpha, beta));
虽然语法可能不同,但表达式或计算列上的索引解决了这个问题。
另一种方法是要求 alpha < beta
(使用 check
约束),然后在 (alpha, beta)
.
上构建唯一索引
但是,MySQL 支持以下 none:
check
约束条件
- 表达式索引
- 计算列
所以,剩下的触发器。
只是把它扔在那里:你能不能使用一个生成的列,它总是按顺序组合列(所以 alpha,beta = alphabeta 和 beta,alpha = alphabeta),然后在那个生成的列上创建一个唯一索引? MySql 不是我的包,但这应该是可能的:https://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html
如何从 table 的元组创建主键?
例子-
table a: [id|name]
table b: [id|name]
table axb:[a_id|b_id]
现在我们想给 axb 添加一个主键,这样元组 {alpha, beta} 是唯一的。换句话说,table 不能包含行 (alpha, beta) 和 (beta, alpha)。这将扩展到元组,但我要问的是夫妻开始保持这种简单。
我正在使用 MySql 14.14/5.5.50 - 但我希望这没关系。
请注意,复合键不能解决此问题,因为 a_id/b_id 上的复合键仍会允许具有逆元组顺序的行作为新行
不幸的是,您需要使用触发器在 MySQL 中执行此操作。许多数据库都支持这样的语法:
create unique index unq_t_alpha_beta on (least(alpha, beta), greatest(alpha, beta));
虽然语法可能不同,但表达式或计算列上的索引解决了这个问题。
另一种方法是要求 alpha < beta
(使用 check
约束),然后在 (alpha, beta)
.
但是,MySQL 支持以下 none:
check
约束条件- 表达式索引
- 计算列
所以,剩下的触发器。
只是把它扔在那里:你能不能使用一个生成的列,它总是按顺序组合列(所以 alpha,beta = alphabeta 和 beta,alpha = alphabeta),然后在那个生成的列上创建一个唯一索引? MySql 不是我的包,但这应该是可能的:https://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html