[英]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或其他一些。
我喜欢在可行的情况下使用自然标识符作为主键。 但“无论何时实际”都可能成为严重的制约因素。 如果您的自然标识符是通过以某种方式组合其他三个字段得出的,那么您有四种选择:
使主键成为这三个字段的组合。 这往往是一种痛苦。 然后你所有的连接必须匹配三个字段,搜索必须测试三个字段,等等。
创建一个新字段,该字段是三个字段的串联,并将其用作priamry键。 然后,只要其中一个“基本”字段发生更改,也会更改此连接字段。 这是一个非常非常糟糕的主意。 不要这样做。 它是冗余数据,包含冗余数据带来的所有不良信息。
用一个组合字段替换三个单独的字段。 这比#2更糟糕。 现在,当您需要单个值时,您必须将该字段分开。
放弃并创建合成密钥,如序列号。 使用此作为主键,然后只使用自然键进行显示。 如果我的自然键需要连接或以其他方式操纵三个字段,我倾向于使用此选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.