【问题标题】:Primary key column value as two column values combined with different format主键列值作为结合不同格式的两个列值
【发布时间】:2014-01-28 12:56:22
【问题描述】:

所以我想创建一个主键,它将日期值的年份组合起来,然后是一个外键值,即订单号。

基本上:2010-244

这是我尝试过的,(我知道我应该解析日期字符串的一部分):

ORDERNR int(11) 非空,
收据日期,
RECEIPTNR 作为 RECEIPTDATE + "-" + ORDERNR INT NOT NULL UNIQUE,
外键 (ORDERNR) 参考 ORDER(ORDERNR),
主键 (RECEIPTNR)) 引擎=INNODB;

【问题讨论】:

  • 一个主键可以由多列组成
  • 好吧,假设我制作了一个复合键:PRIMARY KEY (RECEIPTDATE, ORDERNR) as RECEIPTNR) 首先我希望它显示为 RECEIPTNR 这个代码不起作用,其次我将如何添加“ -" 键之间?
  • SELECT CONCAT_WS('-',col1,col2) FROM my_table;

标签: mysql sql add multiple-columns


【解决方案1】:

MySQL 不提供基于函数的索引(仅对字符串中的前导字符进行索引)。换句话说,您想在表达式上创建索引,而 MySQL 不支持。

如果日期的“年”部分是唯一的,则数据每年只能有一个日期。因此,您可以在整个日期上拥有唯一索引。

这将被接受为主键:

unique (RECEIPTDATE, ORDERNR);

但这并不能在一年内给您带来独特性。

另一种选择——我不推荐,但我建议因为它可能有效——是将日期存储在 YYYY-MM-DD 格式的字符串中。然后你可以这样做:

unique (RECEIPTDATESTRING(4), ORDERNR)

另一种方法是使用触发器来测试唯一性。

进一步的建议。不要创建复合主键,尤其是当其中一个键只是列的一部分时。相反,在字段上使用unique 约束并具有自动递增的主键。

【讨论】:

  • 感谢您的信息和帮助!
猜你喜欢
  • 2016-11-02
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多