簡體   English   中英

Mysql選擇PRIMARY鍵= x的記錄

[英]Mysql Select record where PRIMARY key = x

我的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和復合鍵時的標准是什么。 注意:我不想在表中添加自動增量鍵來解決這個問題。 如果不可能,那么我將在我的網址中傳遞三個約束。

我看到你問題的兩個部分。 第一部分是關於引用復合值。 我不確定MySQL是否支持這個,但它將是SQL標准的方式:

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

另一部分是使用縮寫語法引用主鍵列。 我不知道有任何這種可能性。

不,沒有這樣的方式,無論是在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'

它是可怕的,因為它不允許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使用索引。表不再標准化,但非規范化是你需要做的權衡,有時需要提高性能或可用性。這沒什么不對。

您可以創建一個存儲過程,將'20001-1-2011-01-07 14:04:40' (字符串)作為參數,然后解析它並在過程中生成SELECT語句。

沒有可能這樣做。 預解析的存儲過程是完成此操作的一種方法。 如果您不必堅持使用此表設計,我建議將主鍵更改為可以設置為自動增量的新列。

如果您必須堅持使用此設計,那么您仍然可以添加一個新的“映射”表,顧名思義就是將您的組合映射到主鍵:

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時將映射表與原始表連接。

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM