繁体   English   中英

字符串作为主键?

[英]String as primary KEY?

我有这个数据库结构

CREATE TABLE `productinfo` (
  `ProductID` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) NOT NULL,
  `ProductImage` varchar(255) NOT NULL,
  `CategoryID` int(11) NOT NULL,
  `SubCategoryID` int(11) NOT NULL,
  `ProductBrief` varchar(255) NOT NULL,
  `Features` text NOT NULL,
  `Specifications` text NOT NULL,
  `Reviews` text NOT NULL,
  `Price` varchar(255) NOT NULL,
  `Status` tinyint(4) NOT NULL,
  PRIMARY KEY (`ProductID`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;

我现在需要将ProductID,CategoryID和SubCategoryID转换为类似Ps-5678的字符串作为部件号。 ProductID是主键,因此如何更改数据库的结构。 CategoryID和SubCategoryID是其他表中的主键,因此我如何处理它......就像转动一样容易

  `ProductID` int(11) NOT NULL AUTO_INCREMENT

变成一个字符串......并摆脱它

  PRIMARY KEY (`ProductID`)

想法,建议任何人

主键用于数据库。

显示名称适用于最终用户。

不要混淆彼此! 不要用有意义的东西制作主键。 你迟早会后悔的。

将代理键/身份/自动编号作为主键是一个非常好的主意,并且在数据库设计中被广泛使用。

您可以添加列甚至是DERIVED COLUMN,并在其上添加唯一约束。

我相信应该那么容易。 但是你需要确定你想要使用的字符串类型http://dev.mysql.com/doc/refman/5.1/en/string-types.html

您的要求不清楚。 你怎么得到3个int列的“PS-5678”? 您的示例中只有2个组件。

你只需要将3个INT转换为单个CHAR()字符串吗?

如果是这样,数据库很好,根本不需要更改表格!?!?! 这三个组件已经可用,正确分离,作为不同的列。 您正在寻找的只是将三个组件显示为单个字符串。

我从你的问题中不清楚你对产品,类别和子类别做了什么来制作你的零件编号。 为了论证,我假设你将它们连接在一起,如产品123,类别456,子类别789给出部件号123-456-789或其他一些。

我喜欢在可行的情况下使用自然标识符作为主键。 但“无论何时实际”都可能成为严重的制约因素。 如果您的自然标识符是通过以某种方式组合其他三个字段得出的,那么您有四种选择:

  1. 使主键成为这三个字段的组合。 这往往是一种痛苦。 然后你所有的连接必须匹配三个字段,搜索必须测试三个字段,等等。

  2. 创建一个新字段,该字段是三个字段的串联,并将其用作priamry键。 然后,只要其中一个“基本”字段发生更改,也会更改此连接字段。 这是一个非常非常糟糕的主意。 不要这样做。 它是冗余数据,包含冗余数据带来的所有不良信息。

  3. 用一个组合字段替换三个单独的字段。 这比#2更糟糕。 现在,当您需要单个值时,您必须将该字段分开。

  4. 放弃并创建合成密钥,如序列号。 使用此作为主键,然后只使用自然键进行显示。 如果我的自然键需要连接或以其他方式操纵三个字段,我倾向于使用此选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM