Mysql选择PRIMARY键= x的记录

时间:2011-01-24 23:35:21

标签: mysql composite-primary-key

我的mysql表中有一个主键,它由三列组成。

CREATE TABLE IF NOT EXISTS `bb_bulletin` (
  `OfficeCode` int(5) NOT NULL,
  `IssuerId` int(11) NOT NULL,
  `BulletinDtm` datetime NOT NULL,
  `CategoryCode` varchar(4) NOT NULL,
  `Title` varchar(255) NOT NULL,
  `Content` text NOT NULL,
  PRIMARY KEY (`OfficeCode`,`IssuerId`,`BulletinDtm`),
  UNIQUE KEY `U_IssuerId` (`IssuerId`,`OfficeCode`,`BulletinDtm`),
  UNIQUE KEY `U_CategoryCode` (`CategoryCode`,`OfficeCode`,`IssuerId`,`BulletinDtm`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

是否有一种速记方法可以为主键的给定值选择记录。

我试过了。

SELECT * FROM `bb_bulletin` WHERE PRIMARY = '20001-1-2011-01-07 14:04:40'

而不是长手法,

SELECT * From bb_bulletin WHERE OfficeCode = 20001 AND IssuerId = 1 AND BulletinDtm = 2011-01-07 14:04:40

在表格中处理php和复合键时的标准是什么。 注意:我不想在表中添加自动增量键来解决这个问题。如果不可能,那么我将在我的网址中传递三个约束。

4 个答案:

答案 0 :(得分:5)

我看到你问题的两个部分。第一部分是关于引用复合值。我不确定MySQL是否支持这一点,但这将是SQL标准的做法:

SELECT * FROM bb_bulletin WHERE (OfficeCode, IssuerId, BulletinDtm) = (20001, 1, '2011-01-07 14:04:40');

另一部分是使用缩写语法引用主键列。我不知道有这种可能性。

答案 1 :(得分:1)

不,无论是在MySQL中,还是在我所知道的任何SQL方言中,都没有这样的方法。

您应该在PHP中拆分20001-1-2011-01-07 14:04:40字符串并使用其部分来构建MySQL查询。

我可能还会补充一点,复合主键可能不是最好的表现(尤其是使用InnoDB表)

同样INT(5)仍然需要与INT(11)(或普通INT)相同的空间。对于较小的整数类型,请使用TINYINTSMALLINTMEDIUMINT


笨拙的解决方法部分

以下解决方案应该按您所希望的方式运行,但会以资源和/或性能为代价。除非你真的不能使用最简单的解决方案,否则你不应该使用这些。


可怕的方式就是这样 WHERE CONCAT(OfficeCode,IssuerId,BulletinDtm) = '20001-1-2011-01-07 14:04:40'

HORRIBLE 因为它不允许MySQL使用索引来实际加速查询。

请不要这样做。


另一种方式。在表格中添加CHAR(32)列,并将其设为PK。在其中存储您之前PK列的MD5哈希值(即MD5('20001-1-2011-01-07 14:04:40')。然后您可以查询:WHERE newPKcolumn = MD5('20001-1-2011-01-07 14:04:40')。这将允许您做你想做的事情,让MySQL使用索引。表格不再标准化,但非规范化是你有时需要做的权衡,以提高性能或可用性。这没有什么不妥。

答案 2 :(得分:0)

您可以创建一个存储过程,将'20001-1-2011-01-07 14:04:40'(一个字符串)作为参数,然后解析它并在过程中生成SELECT语句。

答案 3 :(得分:0)

没有可能这样做。预解析的存储过程是完成此操作的一种方法。如果您不必坚持使用此表设计,我建议将主键更改为可以设置为自动增量的新列。

如果您必须坚持使用此设计,那么您仍然可以添加一个新的“映射”表,顾名思义就是将您的组合映射到主键:

CREATE TABLE IF NOT EXISTS `bbb_mapping` (
  `YourPK` int(11) NOT NULL AUTO_INCREMENT,
  `OfficeCode` int(5) NOT NULL,
  `IssuerId` int(11) NOT NULL,
  `BulletinDtm` datetime NOT NULL
  PRIMARY KEY (`YourPK`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

使用此方法,您可以在查询字符串中使用YourPK时将映射表与原始表连接。

干杯