【问题标题】:SQL - Tuple as Primary KeySQL - 元组作为主键
【发布时间】:2017-01-09 23:28:10
【问题描述】:

如何从表的元组中创建主键?

例子-

table a: [id|name]
table b: [id|name]
table axb:[a_id|b_id]

现在我们要向 axb 添加一个主键,以便元组 {alpha, beta} 是唯一的。换句话说,该表不能包含行 (alpha, beta) 和 (beta, alpha)。这将扩展到 ntuples,但我要求夫妻开始保持简单。

我正在使用 MySql 14.14/5.5.50 - 但我希望这没关系。

请注意,复合键并不能解决此问题,因为 a_id/b_id 上的复合键仍将允许具有逆元组顺序的行作为新行

【问题讨论】:

标签: sql primary-key unique-constraint


【解决方案1】:

不幸的是,您需要在 MySQL 中使用触发器来执行此操作。许多数据库会支持如下语法:

create unique index unq_t_alpha_beta on (least(alpha, beta), greatest(alpha, beta));

虽然语法可能不同,但表达式或计算列上的索引可以解决这个问题。

另一种方法是要求alpha < beta(使用check 约束),然后在(alpha, beta) 上构建唯一索引。

但是,MySQL 不支持以下任何一项:

  • check 约束
  • 表达式索引
  • 计算列

所以,这就留下了触发器。

【讨论】:

  • 谢谢@Gordon Linoff。多么令人失望。在这个特定的例子中,我没有自我引用,你的“检查”解决方案会很棒,但不值得转向新的 DBMS。
【解决方案2】:

只是把它扔在那里:你可以使用一个生成的列,它总是按顺序组合列(所以 alpha,beta = 字母表和 beta,alpha = 字母表),然后在该生成的列上创建一个唯一索引? MySql 不是我的包,但这说明它应该是可能的:https://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2016-11-02
    相关资源
    最近更新 更多